如何提高Lucene的搜索速度
译自:http://wiki.apache.org/lucene-java/ImproveSearchingSpeed
这里讨论了提高基于Lucene的应用程序搜索速度的几种方法。如果你想提高索引的速度,请阅读“如何提高Lucene构建索引的速度”。
首先确定你需要加快搜索速度。这里的很多方法很容易尝试,但是有些会增加你程序的复杂性。所以请首先确定搜索速度确实太慢,而且速度问题确实是Lucene导致的。
确保你使用的是最新版本的Lucene。
使用本地文件系统。
远程文件系统搜索的速度总是会慢一些。如果你的索引必须放在远程文件系统之上,那么可以考虑把远程文件系统用“只读方式”加载(mount)。某些时候这会改善性能。
使用更快的硬件,尤其是更快的IO系统。
固态硬盘(solid-state disk,SSD)非常适合Lucene的搜索。SSD的寻道时间大概是传统磁盘式硬盘的100倍,也就是说常见的寻道时间造成的开销几乎可以忽略掉了。也就是说装有SSD的机器无需太多的内存作为文件缓存,搜索器在允许反应之前需要的预热(warm-up)时间更短。
调节操作系统。
Linux可以调节的一个典型的参数是swappiness(参看http://kerneltrap.org/node/3000,译注:可理解为交换系统,调节物理内存和交换分区使用倾向的),这个参数控制了操作系统把内存交换出到IO缓存的倾向性。这个参数在大多数Linux发行版中的默认设置都是一个很大的数(也就是说,倾向于交换分区),这容易造成严重的搜索延迟,特别是在查询频率不高的情况下,搜索一个大的索引时。请尝试把swappiness调低,甚至关闭(把它设置为0)。Windows也有一个选框,在我的电脑->属性->高级->性能设置->内存使用,允许你选择倾向于应用程序还是系统缓存,好像也是起这个作用的。
使用readOnly=true选项打开IndexReader。
在多线程共享同一个reader的时候这将起巨大的作用,因为这样会去掉处理线程冲突的代码。
在非Windows平台,使用NIOFSDirectory取代FSDirectory。
这样访问这些文件的时候,也会去掉处理线程冲突的代码。不幸的是,由于Sun JRE Windows版本长期存在的bug(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6265734),NIOFSDirectory在Windows下表现很差。
使用IndexSearcher的同一个实例。
在程序的查询和线程之间,使用单一的一个IndexSearcher的实例。
测量性能的时候,忽视第一条查询。
对搜索器的第一次查询,要付出初始化缓存的代价(特别是按照字段排序的时候),会干扰你的结论(假设你重用搜索器进行多次查存)。另外一方面,如果你一遍遍的重复同样的查询,结论也会被扭曲,因为操作系统会使用它的缓存加速IO操作。Linux(核心2.6.16或者更新版本)下,你可以用命令 sync ; echo 3 > /proc/sys/vm/drop_caches 来清空缓存。参见http://linux-mm.org/Drop_Caches。
仅在需要的时候重新打开IndexSearcher。
只有在需要让最新提交的更新出现在搜索中的时候,才应该重新打开IndexSearcher。注意,重新打开搜索器有它的开销(在大的索引和排序打开的情况下可以被察觉到的),必须将这一开销最小化。可以考虑在面对第一个查询之前,使用预热技术对缓存进行预热。
搜索前对你的索引进行优化(optimize)。
优化(optimize)过的索引只有一个段,这样通常比多个段速度快得多,尤其是对于大的索引。如果你的程序不经常更新索引,那么最好是,先构建索引,然后优化,使用优化过的索引进行搜索。如果你的索引更新频率很高,而且更新后就要刷新搜索器的话,那么优化对你的开销就太大了,你可以采用降低合并因子的方法。
降低合并因子(mergeFactor)。
小的合并因子意味着更少的段和更快的搜索。然而,这将降低索引的速度,所以,你应该测试这个值,直到找到对于你的程序满足平衡的值。
限制保存字段和词向量的使用。
从索引中获取这些信息开销太大。一般来说,你应该只获取用户看前可见的“页”内的条目的这些信息,而不是整个结果集的。针对每个获取的文档,Lucene必须寻道到不同文件的不同位置。尝试首先用docID排序你要获取的文档(译注:有可能提高寻道效率)。
在你获取一个文档时,使用FieldSelector仔细的选择要载入哪些字段,以及如何载入他们。
不要枚举比所需命中结果更多的结果。
枚举所有的命中很慢,有两个原因。首先,返回Hits对象的search()方法在你需要超过100个命中的时候,需要内部重新执行搜索。解决方法:用带有HitCollector的search方法代替。其次,命中通常遍布磁盘的每个角落,访问全部需要大量的I/O活动。这很难避免,除非索引小到可以直接放到内存里。如果你不需要完整的文档,而只需要一个(小的)字段,那么你可以用FieldCache类来缓存它,这样就可以告诉访问它了。
使用模糊查询(fuzzy query)的时候设置最小的前缀长度。
模糊查询执行耗费CPU的字符串比较──要避免将用户输入的词和所有的索引的词项进行比较,应该只比较前“N”个字符相同的词项。前缀长度是QueryParser和FuzzyQuery都有的参数,默认为0,所有的词项都要比较。
考虑使用过滤器(filter)。
把结果限定在索引的一部分时,使用缓存的位域过滤器比使用查询条件高效得多。尤其是在限制条件包含了一个大索引的大量文档时。过滤器通常用于限定一个分类下的结果,但是可以在很多中情况下替代任何查询条件。查询和过滤之间的一个区别在于,查询影响结果评分,过滤不影响。
找到瓶颈。
复杂的查询分析或者对结果过度处理,是隐藏的搜索瓶颈的例子。使用VisualVM这样的工具profile程序可以帮助定位这些问题。
分享到:
相关推荐
- **缓存优化**: 利用内存缓存提高搜索速度。 - **近实时搜索**: Lucene支持近乎实时的搜索,即使在索引更新后,搜索结果也能快速反映变化。 综上所述,"Lucene搜索引擎 JSP + JAVA"项目展示了如何结合这三个强大的...
3. **缓存策略**: 利用Lucene的缓存机制,如BitSetDocValues缓存,提升搜索速度。 4. **结果相关性**: 考虑用户行为、地理位置等因素,调整评分公式,提高搜索结果的相关性。 5. **拼音和同义词支持**: 引入拼音库...
2. 基于内存的缓存:为了提高搜索效率,Lucene允许在内存中缓存部分索引,如TermFreqVector,这可以显著提升查询速度。 3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程...以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据检索的效率和便利性。
- 采用索引机制提高搜索速度。 - 在大数据量环境下表现更优。 #### 三、Lucene简介及其架构 1. **Lucene简介**: - Lucene是一款高性能、全功能的全文检索引擎库。 - 适用于多种编程语言,但最初为Java设计。 ...
此过程中,文档会被分词、去噪、标准化等处理,以提高搜索效率和准确性。索引建立过程是耗时的,尤其是对于大规模的数据集来说,但这是一次性的操作,一旦完成,即可用于后续的快速搜索。 - **查询处理**:用户...
2. **索引分片(Sharding)**:大型数据集时,将索引分散到多个节点,提高搜索速度。 3. **近实时搜索(Near Realtime Search)**:利用 NRT(Near Realtime)机制,更新索引后无需重启服务即可搜索到新内容。 4. **...
同时,优化UI组件的绘制和更新,减少不必要的计算,都能有效提高界面响应速度。 总结,这个基于Java和Lucene的桌面搜索程序展现了全文检索技术在桌面应用中的强大潜力。尽管目前存在一些不足,但通过不断迭代和优化...
- 增加缓存机制,提高搜索速度。 - 使用倒排索引优化查询性能。 - 实现近实时搜索,让索引更新更快地反映在搜索结果中。 - 考虑使用多线程或分布式索引和搜索,以支持大规模数据和高并发访问。 总结,利用LUCENE...
集成Spring MVC和Lucene能为Web应用带来高效的全文搜索功能,提高用户查找信息的速度和准确性。然而,实际应用中需要考虑的因素很多,如并发控制、索引重建策略、性能优化等,因此在开发过程中需要不断调整和优化,...
书中还涵盖了实际项目开发中可能遇到的问题和解决方案,例如如何提高搜索速度、如何处理海量数据、如何优化查询性能等。这些实战经验对于开发者来说是极其宝贵的,能帮助他们在实际工作中避免很多常见问题,提升搜索...
- **性能提升**:可能通过改进索引结构、并行化处理或内存管理,以提高索引和搜索速度。 - **资源管理**:针对中型规模数据,调整内存分配和磁盘使用策略,确保系统稳定性和响应速度。 - **查询优化**:优化查询解析...
此外,Lucene还提供了倒排索引技术,这是一种高效的检索机制,使得搜索速度非常快。 Heritrix是互联网档案(Internet Archive)的开源项目,主要用于大规模网络数据采集。它设计用于可配置性和可扩展性,允许设置...
**Lucene搜索引擎Demo详解** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,是Java编程语言中广泛使用的搜索引擎框架。它提供了强大的索引和搜索功能,使得开发者能够轻松地在应用中集成高级的文本...
倒排索引是一种数据结构,它将每个术语映射到包含该术语的文件列表,大大提高了搜索速度。 2. **查询解析**:用户输入的查询字符串会被解析成一系列的搜索条件,Lucene的QueryParser可以将自然语言查询转换为复杂的...
- **优化与调整**:根据实际效果,可能需要调整分词策略、评分算法等,以提高搜索质量和速度。 **4. 进阶使用** 除了基础功能,Weblucene还提供了许多高级特性,如布尔查询、短语搜索、模糊匹配、近似搜索等。你...
它通过建立索引来加速文档检索过程,使得搜索速度非常快。 - **集成方式**:在使用Ajax构建的前端界面中集成Lucene后端服务,用户可以享受更快捷的搜索体验。例如,在用户输入关键词时,前端可以通过Ajax异步请求...
为了提高搜索性能,Lucene 提供了倒排索引、位集合(BitSet)和缓存等技术。倒排索引允许快速定位匹配的文档;位集合用于高效地处理大量文档的筛选;缓存则可以加速频繁查询的响应速度。 **六、更新与删除** ...