`
javaso
  • 浏览: 53214 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何提高和优化Lucene搜索速度(转)

阅读更多

     原文地址

     确认你在使用Lucene的最新版本

  • 尽量使用本地文件系统

远程文件系统一般来说都会降低搜索速度。如果索引必须分布在远程服务器,可以尝试将远程文件系统设置为只读。在某些情况下,这样可以提高性能。

  • 使用更快的硬件设备,特别是更快的IO设备

Lucene搜索可以很好的工作在基于闪存的固态硬盘上。固态硬盘的寻道时间大概比传统的以磁盘为基础的硬盘快100倍。这意味着,配备固态硬盘的机器用于文件缓存的内存将变少,搜索需要较少的热身时间,能够更加迅速作出反应。

  • 加大你的机器内存容量,给Java虚拟机分配更多的内存

索引越大,在搜索时需要使用更多的内存。如果你的机器没有足够大的内存或者你的Java虚拟机没有设置足够大的堆空间,频繁的页面文件交换和虚拟内存的使用将使你的硬盘处于超负荷状态运行,此时,一切的程序都将运行的很慢。

  • 在程序中使用一个唯一的IndexSearch实例

在程序的查询中共享一个IndexSearch实例,它支持多线程安全。

  • 当测试搜索速度时,忽略第一次查询时间

第一次搜索将花费部分时间在缓存上(特别在按某个字段排序的情况下),从而可能使你的测试结果不太准确(假设你在多个查询中复用一个IndexSearch实例)。另一方面来说,如果你一次又一次的重复同一个查询,所得的测试结果也是不准确的。因为操作系统将利用其高速缓存加速IO操作。在Linux上,你可以使用如下命令清除磁盘高速缓存:

echo 3 > /proc/sys/vm/drop_caches.

  • 只有在必要的时候才重新构造IndexSearcher

为了获得更新的索引信息,你必须重新构造IndexSearch。当然,重新构造一个searcher会带来一定的系统开销(注意,这大多发生在大索引以及自定义排序上),所以你应该尽量减少重新构造。你可以考虑在重新构造之后强制进行一次搜索预热。

  • 在搜索之前调用optimize优化你的索引

一个优化后的索引只含有一个Segment(其实说法不严谨,这也取决于一个Segment最多含有的文档参数),这将比同等情况下含多个Segment的索引搜索速度更快。特别是在大索引的情况下。如果你的程序不经常更新索引,那么花费一定的时间来优化下,然后使用优化后的索引来进行搜索。如果你的索引更新的频率很高,那么优化索引将会是一个很耗时间的事情,这个时候你可以减少mergeFactor参数。

个人建议,在频繁更新索引的情况下,使用两个索引,一个大的优化好的历史索引,一个小的实时添加的索引(如果数据不大的情况下,直接使用RAMDirectory,然后定时的合并到大索引中)

  • 减小MergeFactor合并因子的值

更小的合并因子意味着索引中拥有更少的Segment,搜索速度也将更快。但是,这也将降低索引速度。你需要自己测试一个值来平衡二者的关系。(此条只适用于不能经常优化的索引库)

  • 限制存储字段的使用以及获取尽可能少的数据

从索引中获取数据是一件很耗时间的事情,你最好只获取用户需要的数据。而不是整个文档中存储的数据。每个文档的取回,lucene都必须去索引文件中不同的地方甚至是不同的文件中查找。可以尝试将你需要的文档先按文档编号排序再获取。

  • 当你取回文档时,使用FieldSelector仔细的选择哪些字段需要获取,如何获取。
  • 不要获取多于你需要的hits

获取更多的搜索结果将会降低搜索速度。有两个原因:其一,search方法在返回Hits对象时,如果超过100hitslucene将在内部自动重新执行搜索。解决方案:使用返回HitCollectorSearch方法。其二,搜索结果可能分布在硬盘的不同地方,获取他们可能需要很多的IO操作。这个是很难避免的,除非索引比较小,可以直接缓存到内存当中。如果你不需要完整的文档对象,你只需要其中的一个很小的字段,你可以使用FieldCache类来缓存它,从而达到快速访问的效果。

  • 当使用 fuzzy 查询时设置一个较小的比较长度prefixLength

Fuzzy查询执行CPU密集型字符串比较,尽量避免将用户查询的Term与所有的 Term进行比较。你可以设置只比较以前N个字符开头的TermprefixLengthQueryParser以及FuzzyQuery中可以设置。默认值为0,将比较所有的Term

  • 考虑使用filters

有时候我们的查询将限制部分索引中的记录,这时候使用一个经过缓存了的bit set filter将比使用查询子句更有效,尤其在一个大索引中。过滤器经常用在查询分类结果上。它可以用查询子句限制来替换,区别在于使用Query将影响文档的得分,而Filter不会。

 

分享到:
评论

相关推荐

    lucene、lucene.NET详细使用与优化详解

    - 索引优化:合理设置Field的存储和索引属性,平衡搜索速度和存储空间。 - 使用Segment:lucene通过Segment来分块存储索引,多段合并可以减少索引碎片,提高检索效率。 - 分布式索引和搜索:通过分布式部署,...

    lucene的封装和性能优化

    优化字段类型,例如,对于非全文搜索的字段,可以设置为不分词的TextField,以减少索引空间和提高搜索速度。另外,定期重建索引,以消除旧的和不必要的数据。 #### 3.5 查询优化 合理使用查询语法,避免复杂的查询...

    lucene站内搜索

    总之,Lucene站内搜索提供了一套强大且灵活的搜索框架,通过合理的配置和优化,可以实现高效、准确的站内信息检索。在实际项目中,开发者需要根据具体需求调整Analyzer、索引策略以及查询处理方式,以实现最佳的搜索...

    Lucene搜索引擎 JSP + JAVA

    **Lucene搜索引擎 JSP + JAVA** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,它提供了索引和搜索大量文本数据的能力。在这个项目中,Lucene被结合了JSP(JavaServer Pages)和JAVA技术,创建了一个...

    lucene3.6 搜索例子

    2. 基于内存的缓存:为了提高搜索效率,Lucene允许在内存中缓存部分索引,如TermFreqVector,这可以显著提升查询速度。 3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新...

    ssh+lucene搜索实例

    SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程...以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据检索的效率和便利性。

    基于Lucene和Heritrix的职位垂直搜索引擎的设计与实现

    这篇论文的核心是利用开源工具Lucene和Heritrix来构建一个针对职位信息的垂直搜索引擎,旨在提高招聘行业的信息检索效率和准确性。 首先,Lucene是一个强大的全文搜索引擎库,它提供了文本分析、索引和搜索的基本...

    springmvc集成lucene全文搜索

    集成Spring MVC和Lucene能为Web应用带来高效的全文搜索功能,提高用户查找信息的速度和准确性。然而,实际应用中需要考虑的因素很多,如并发控制、索引重建策略、性能优化等,因此在开发过程中需要不断调整和优化,...

    基于Lucene的中型搜索引擎(C#)

    - **性能提升**:可能通过改进索引结构、并行化处理或内存管理,以提高索引和搜索速度。 - **资源管理**:针对中型规模数据,调整内存分配和磁盘使用策略,确保系统稳定性和响应速度。 - **查询优化**:优化查询解析...

    精通ajax+lucene做搜索引擎

    2. **后端集成**:配置和优化Lucene服务,使其能够高效地处理大量的文档检索请求。可以考虑使用分布式部署方案来提高系统的可扩展性和可用性。 3. **数据管理**:确保索引数据的准确性和时效性,定期更新索引以反映...

    LUCENE搜索引擎基本工作原理

    4. **存储与压缩**:索引数据会被存储在磁盘上,并进行优化,如使用压缩技术减少存储空间,提高检索速度。 **二、查询处理** 当用户输入查询时,Lucene执行以下操作: 1. **查询解析**:用户输入的查询字符串被...

    Weblucene 站内搜索

    - **优化与调整**:根据实际效果,可能需要调整分词策略、评分算法等,以提高搜索质量和速度。 **4. 进阶使用** 除了基础功能,Weblucene还提供了许多高级特性,如布尔查询、短语搜索、模糊匹配、近似搜索等。你...

    lucene全文检索简单索引和搜索实例

    三、Lucene搜索步骤 1. 打开索引:使用Directory对象和IndexReader打开已创建的索引。 2. 创建搜索器:基于IndexReader创建一个IndexSearcher对象,它是实际执行搜索操作的工具。 3. 构建查询:使用QueryParser...

    lucene做的桌面搜索

    同时,优化UI组件的绘制和更新,减少不必要的计算,都能有效提高界面响应速度。 总结,这个基于Java和Lucene的桌面搜索程序展现了全文检索技术在桌面应用中的强大潜力。尽管目前存在一些不足,但通过不断迭代和优化...

    基于Lucene的搜索策略研究

    此过程中,文档会被分词、去噪、标准化等处理,以提高搜索效率和准确性。索引建立过程是耗时的,尤其是对于大规模的数据集来说,但这是一次性的操作,一旦完成,即可用于后续的快速搜索。 - **查询处理**:用户...

    lucene 实现类似百度搜索

    2. **索引分片(Sharding)**:大型数据集时,将索引分散到多个节点,提高搜索速度。 3. **近实时搜索(Near Realtime Search)**:利用 NRT(Near Realtime)机制,更新索引后无需重启服务即可搜索到新内容。 4. **...

    lucene-2.2.0zip

    1. **性能优化**:5.5.0版本在2.2.0的基础上进行了大量的性能优化,包括更快的索引构建速度和更高效的搜索算法。 2. **复杂查询支持**:新增了对更多类型查询的支持,如短语查询、近似查询、范围查询等,使搜索功能...

    Lucene搜索实例

    为了提高搜索性能,Lucene 提供了倒排索引、位集合(BitSet)和缓存等技术。倒排索引允许快速定位匹配的文档;位集合用于高效地处理大量文档的筛选;缓存则可以加速频繁查询的响应速度。 **六、更新与删除** ...

    lucene 2.0 api以及lucene 3.0 api

    5. **性能优化**: 对内部数据结构进行了优化,提升了索引和搜索速度,降低了内存占用。 6. **倒排索引增强**: 在 3.0 版本中,引入了位向量(BitSet)技术,提高了查询效率,尤其是布尔查询。 7. **文档更新**: `...

Global site tag (gtag.js) - Google Analytics