转自http://hi.baidu.com/expertsearch/blog/item/2195a237bfe83d360a55a9fd.html
这篇文章主要介绍了如何提高Lucene的搜索速度。介绍的大部分思路都是很容易尝试的,当然另外一部分可能会加大你程序的复杂度。所以请确认搜索速度确实很慢,而且很慢的原因确实是因为Lucene自身而造成的。推荐姐妹篇:如何提高和优化Lucene索引速度
-
确认你在使用Lucene的最新版本
-
尽量使用本地文件系统
远程文件系统一般来说都会降低搜索速度。如果索引必须分布在远程服务器,可以尝试将远程文件系统设置为只读。在某些情况下,这样可以提高性能。
Lucene搜索可以很好的工作在基于闪存的固态硬盘上。固态硬盘的寻道时间大概比传统的以磁盘为基础的硬盘快100倍。这意味着,配备固态硬盘的机器用于文件缓存的内存将变少,搜索需要较少的热身时间,能够更加迅速作出反应。
-
加大你的机器内存容量,给Java虚拟机分配更多的内存
索引越大,在搜索时需要使用更多的内存。如果你的机器没有足够大的内存或者你的Java虚拟机没有设置足够大的堆空间,频繁的页面文件交换和虚拟内存的使用将使你的硬盘处于超负荷状态运行,此时,一切的程序都将运行的很慢。
在程序的查询中共享一个IndexSearch实例,它支持多线程安全。
第一次搜索将花费部分时间在缓存上(特别在按某个字段排序的情况下),从而可能使你的测试结果不太准确(假设你在多个查询中复用一个IndexSearch实例)。另一方面来说,如果你一次又一次的重复同一个查询,所得的测试结果也是不准确的。因为操作系统将利用其高速缓存加速IO操作。在Linux上,你可以使用如下命令清除磁盘高速缓存:
echo 3 > /proc/sys/vm/drop_caches.
-
只有在必要的时候才重新构造IndexSearcher
为了获得更新的索引信息,你必须重新构造IndexSearch。当然,重新构造一个searcher会带来一定的系统开销(注意,这大多发生在大索引以及自定义排序上),所以你应该尽量减少重新构造。你可以考虑在重新构造之后强制进行一次搜索预热。
一个优化后的索引只含有一个Segment(其实说法不严谨,这也取决于一个Segment最多含有的文档参数),这将比同等情况下含多个Segment的索引搜索速度更快。特别是在大索引的情况下。如果你的程序不经常更新索引,那么花费一定的时间来优化下,然后使用优化后的索引来进行搜索。如果你的索引更新的频率很高,那么优化索引将会是一个很耗时间的事情,这个时候你可以减少mergeFactor参数。
个人建议,在频繁更新索引的情况下,使用两个索引,一个大的优化好的历史索引,一个小的实时添加的索引(如果数据不大的情况下,直接使用RAMDirectory,然后定时的合并到大索引中)
更小的合并因子意味着索引中拥有更少的Segment,搜索速度也将更快。但是,这也将降低索引速度。你需要自己测试一个值来平衡二者的关系。(此条只适用于不能经常优化的索引库)
从索引中获取数据是一件很耗时间的事情,你最好只获取用户需要的数据。而不是整个文档中存储的数据。每个文档的取回,lucene都必须去索引文件中不同的地方甚至是不同的文件中查找。可以尝试将你需要的文档先按文档编号排序再获取。
-
当你取回文档时,使用FieldSelector仔细的选择哪些字段需要获取,如何获取。
-
不要获取多于你需要的hits
获取更多的搜索结果将会降低搜索速度。有两个原因:其一,search方法在返回Hits对象时,如果超过100个hits,lucene将在内部自动重新执行搜索。解决方案:使用返回HitCollector的Search方法。其二,搜索结果可能分布在硬盘的不同地方,获取他们可能需要很多的IO操作。这个是很难避免的,除非索引比较小,可以直接缓存到内存当中。如果你不需要完整的文档对象,你只需要其中的一个很小的字段,你可以使用FieldCache类来缓存它,从而达到快速访问的效果。
-
当使用 fuzzy 查询时设置一个较小的比较长度 (prefixLength)
Fuzzy查询执行CPU密集型字符串比较,尽量避免将用户查询的Term与所有的 Term进行比较。你可以设置只比较以前N个字符开头的Term。prefixLength在QueryParser以及FuzzyQuery中可以设置。默认值为0,将比较所有的Term。
有时候我们的查询将限制部分索引中的记录,这时候使用一个经过缓存了的bit set filter将比使用查询子句更有效,尤其在一个大索引中。过滤器经常用在查询分类结果上。它可以用查询子句限制来替换,区别在于使用Query将影响文档的得分,而Filter不会。
分享到:
相关推荐
- 索引优化:合理设置Field的存储和索引属性,平衡搜索速度和存储空间。 - 使用Segment:lucene通过Segment来分块存储索引,多段合并可以减少索引碎片,提高检索效率。 - 分布式索引和搜索:通过分布式部署,...
优化字段类型,例如,对于非全文搜索的字段,可以设置为不分词的TextField,以减少索引空间和提高搜索速度。另外,定期重建索引,以消除旧的和不必要的数据。 #### 3.5 查询优化 合理使用查询语法,避免复杂的查询...
Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎和站内搜索解决方案中。它提供了丰富的文本分析、索引和搜索功能,使得开发者能够轻松地在自己的应用程序中实现复杂的全文检索...
**Lucene搜索引擎 JSP + ...综上所述,"Lucene搜索引擎 JSP + JAVA"项目展示了如何结合这三个强大的技术,构建一个高效、灵活的全文搜索引擎。通过深入理解和实践,开发者可以定制出满足特定需求的搜索引擎解决方案。
2. 基于内存的缓存:为了提高搜索效率,Lucene允许在内存中缓存部分索引,如TermFreqVector,这可以显著提升查询速度。 3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新...
集成Spring MVC和Lucene能为Web应用带来高效的全文搜索功能,提高用户查找信息的速度和准确性。然而,实际应用中需要考虑的因素很多,如并发控制、索引重建策略、性能优化等,因此在开发过程中需要不断调整和优化,...
这篇论文的核心是利用开源工具Lucene和Heritrix来构建一个针对职位信息的垂直搜索引擎,旨在提高招聘行业的信息检索效率和准确性。 首先,Lucene是一个强大的全文搜索引擎库,它提供了文本分析、索引和搜索的基本...
本文将深入探讨一个基于Apache Lucene的中型搜索引擎实现,该实现是由ShootSearch进行优化的。Lucene是一个开源的全文检索库,由Java编写,但可以通过各种语言接口,如C#,来使用。 **1. Lucene简介** Lucene是...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程...以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据检索的效率和便利性。
三、Lucene搜索步骤 1. 打开索引:使用Directory对象和IndexReader打开已创建的索引。 2. 创建搜索器:基于IndexReader创建一个IndexSearcher对象,它是实际执行搜索操作的工具。 3. 构建查询:使用QueryParser...
通过以上步骤和技巧,我们可以使用 Lucene 实现一个强大的搜索引擎,提供类似百度的搜索体验。无论是在网站、应用还是大数据环境中,Lucene 都能以其高效的全文检索能力,为用户提供快速、准确的搜索结果。
同时,优化UI组件的绘制和更新,减少不必要的计算,都能有效提高界面响应速度。 总结,这个基于Java和Lucene的桌面搜索程序展现了全文检索技术在桌面应用中的强大潜力。尽管目前存在一些不足,但通过不断迭代和优化...
4. **存储与压缩**:索引数据会被存储在磁盘上,并进行优化,如使用压缩技术减少存储空间,提高检索速度。 **二、查询处理** 当用户输入查询时,Lucene执行以下操作: 1. **查询解析**:用户输入的查询字符串被...
2. **后端集成**:配置和优化Lucene服务,使其能够高效地处理大量的文档检索请求。可以考虑使用分布式部署方案来提高系统的可扩展性和可用性。 3. **数据管理**:确保索引数据的准确性和时效性,定期更新索引以反映...
- **优化与调整**:根据实际效果,可能需要调整分词策略、评分算法等,以提高搜索质量和速度。 **4. 进阶使用** 除了基础功能,Weblucene还提供了许多高级特性,如布尔查询、短语搜索、模糊匹配、近似搜索等。你...
此过程中,文档会被分词、去噪、标准化等处理,以提高搜索效率和准确性。索引建立过程是耗时的,尤其是对于大规模的数据集来说,但这是一次性的操作,一旦完成,即可用于后续的快速搜索。 - **查询处理**:用户...
- 增加缓存机制,提高搜索速度。 - 使用倒排索引优化查询性能。 - 实现近实时搜索,让索引更新更快地反映在搜索结果中。 - 考虑使用多线程或分布式索引和搜索,以支持大规模数据和高并发访问。 总结,利用LUCENE...
Lucene是一个开源的Java库,提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。 第一章 引言 在信息爆炸的时代,搜索引擎成为人们获取信息的重要工具。Apache Lucene作为一款强大的全文搜索...
为了提高搜索性能,Lucene 提供了倒排索引、位集合(BitSet)和缓存等技术。倒排索引允许快速定位匹配的文档;位集合用于高效地处理大量文档的筛选;缓存则可以加速频繁查询的响应速度。 **六、更新与删除** ...