这篇文章主要介绍了如何提高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不会。
本翻译属于原创,转载时请注明出处,英文原版请查看:
http://wiki.apache.org/jakarta-lucene/ImproveSearchingSpeed
分享到:
相关推荐
- **缓存优化**: 利用内存缓存提高搜索速度。 - **近实时搜索**: Lucene支持近乎实时的搜索,即使在索引更新后,搜索结果也能快速反映变化。 综上所述,"Lucene搜索引擎 JSP + JAVA"项目展示了如何结合这三个强大的...
3. **缓存策略**: 利用Lucene的缓存机制,如BitSetDocValues缓存,提升搜索速度。 4. **结果相关性**: 考虑用户行为、地理位置等因素,调整评分公式,提高搜索结果的相关性。 5. **拼音和同义词支持**: 引入拼音库...
- 索引优化:合理设置Field的存储和索引属性,平衡搜索速度和存储空间。 - 使用Segment:lucene通过Segment来分块存储索引,多段合并可以减少索引碎片,提高检索效率。 - 分布式索引和搜索:通过分布式部署,...
2. 基于内存的缓存:为了提高搜索效率,Lucene允许在内存中缓存部分索引,如TermFreqVector,这可以显著提升查询速度。 3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新...
4. **存储与压缩**:索引数据会被存储在磁盘上,并进行优化,如使用压缩技术减少存储空间,提高检索速度。 **二、查询处理** 当用户输入查询时,Lucene执行以下操作: 1. **查询解析**:用户输入的查询字符串被...
优化字段类型,例如,对于非全文搜索的字段,可以设置为不分词的TextField,以减少索引空间和提高搜索速度。另外,定期重建索引,以消除旧的和不必要的数据。 #### 3.5 查询优化 合理使用查询语法,避免复杂的查询...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程...以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据检索的效率和便利性。
这篇论文的核心是利用开源工具Lucene和Heritrix来构建一个针对职位信息的垂直搜索引擎,旨在提高招聘行业的信息检索效率和准确性。 首先,Lucene是一个强大的全文搜索引擎库,它提供了文本分析、索引和搜索的基本...
- **性能提升**:可能通过改进索引结构、并行化处理或内存管理,以提高索引和搜索速度。 - **资源管理**:针对中型规模数据,调整内存分配和磁盘使用策略,确保系统稳定性和响应速度。 - **查询优化**:优化查询解析...
集成Spring MVC和Lucene能为Web应用带来高效的全文搜索功能,提高用户查找信息的速度和准确性。然而,实际应用中需要考虑的因素很多,如并发控制、索引重建策略、性能优化等,因此在开发过程中需要不断调整和优化,...
同时,优化UI组件的绘制和更新,减少不必要的计算,都能有效提高界面响应速度。 总结,这个基于Java和Lucene的桌面搜索程序展现了全文检索技术在桌面应用中的强大潜力。尽管目前存在一些不足,但通过不断迭代和优化...
此过程中,文档会被分词、去噪、标准化等处理,以提高搜索效率和准确性。索引建立过程是耗时的,尤其是对于大规模的数据集来说,但这是一次性的操作,一旦完成,即可用于后续的快速搜索。 - **查询处理**:用户...
书中还涵盖了实际项目开发中可能遇到的问题和解决方案,例如如何提高搜索速度、如何处理海量数据、如何优化查询性能等。这些实战经验对于开发者来说是极其宝贵的,能帮助他们在实际工作中避免很多常见问题,提升搜索...
2. **后端集成**:配置和优化Lucene服务,使其能够高效地处理大量的文档检索请求。可以考虑使用分布式部署方案来提高系统的可扩展性和可用性。 3. **数据管理**:确保索引数据的准确性和时效性,定期更新索引以反映...
- 增加缓存机制,提高搜索速度。 - 使用倒排索引优化查询性能。 - 实现近实时搜索,让索引更新更快地反映在搜索结果中。 - 考虑使用多线程或分布式索引和搜索,以支持大规模数据和高并发访问。 总结,利用LUCENE...
2. **索引分片(Sharding)**:大型数据集时,将索引分散到多个节点,提高搜索速度。 3. **近实时搜索(Near Realtime Search)**:利用 NRT(Near Realtime)机制,更新索引后无需重启服务即可搜索到新内容。 4. **...
- **优化与调整**:根据实际效果,可能需要调整分词策略、评分算法等,以提高搜索质量和速度。 **4. 进阶使用** 除了基础功能,Weblucene还提供了许多高级特性,如布尔查询、短语搜索、模糊匹配、近似搜索等。你...
以及并行索引和搜索以提高处理速度。我们还可能探讨如何利用NRT(Near Real Time)搜索技术,使得新文档能够几乎实时地被搜索到。 在实际应用中,我们经常需要处理大量数据,因此分布式搜索是一个重要的话题。通过...
倒排索引是一种数据结构,它将每个术语映射到包含该术语的文件列表,大大提高了搜索速度。 2. **查询解析**:用户输入的查询字符串会被解析成一系列的搜索条件,Lucene的QueryParser可以将自然语言查询转换为复杂的...