一、如果提高构建索引速度
1、明确当前性能瓶颈确实是lucene构建索引引起
这个问题需要借助一定的三方性能监控工具,我当时在调优时使用的监控工具是sysstat,下载地址:http://sebastien.godard.pagesperso-orange.fr/download.html ,可以选择你需要的版本,具体使用可以google。
通过这个工具对比观察服务器在构建索引和非构建索引时磁盘IO、CPU、内存使用情况,通过比较一目了然,我当时确定问题时
就是IO出现瓶颈,在构建索引时IO利用率达到了100%并出现IO await,所以我可以很负责任的确定是构建索引引起的性能瓶颈。
截图如下:
2、如果找到确实是构建索引引起的问题,那就要从lucene api着手优化构建索引了
a、确定lucene最新版本
我们产品线上目前版本是2.4,不过现在最新版本是3.0.2,在评估成本情况下可以对版本进行升级,3.0比2.x在性能上面确实改进很多
b、确定存储索引的磁盘是本地磁盘系统,有条件的话可以使用存储
如果磁盘一定要是远程磁盘系统,可以将远程的磁盘挂载到本地,有条件可以使用存储做为存储空间,存在在io读写及吞吐量上面比磁盘高效很多
c、尽量使用一个单例的indexwriter
创建和销毁indexwriter需要花费一定的资源的,这个视情况而定,有些系统拆分索引存储目录,可能针对不同的实例需要不同的indexwriter
d、尽量在内存中构建索引
使用indexwriter的setRAMBufferSizeMB()设置lucene写索引时的中转缓存,当内存索引空间大小超过rambuffersizemb时会将索引批量写入磁盘,这样可以避免io一直处于很高的状态,观察发现io利用率的图形是个波形图
e、尽量使用多文件索引,不要使用复合索引
多文件索引结构:多文件索引是使用一系列索引文件分别存储索引,分散管理数据的索引存储格式。多文件索引在打开时需要读取大量文件,会大大占用系统的文件句柄等资源,造成系统响应速度慢,甚至系统崩溃。
通过indexwriter.setUseCompoundFile(false);//使用多文件系统
复合索引结构:复合索引是把索引相关的一系列数据结构组织到少数几个文件中进行管理的索引存储模式。复合索引把所有的索引数据组合成简单的3个文件,大大减少了打开大量文件的压力。但是使用统一文件存储大量数据会造成数据更新的问题,每次更改需要操作一个大的数据文件,读取和存储都会比较慢。
各有优缺点,不过通过测试发现,多文件系统确实性能高很多,对大文件的存储和读取确实很耗性能
f、重复利用document和field对象
道理很简单,减少document和field对象的创建可以减少gc次数,数据量小不明显,当数据量在500万以上时,这就很明显了
g、当你使用保存的field或者term的时候,总是用相同的顺序把field添加到document。
Lucene的合并有一种优化,依赖于对保存的字段和词向量进行的批量复制,但是只有在段间字段名->数字的映射保持一致的情况下才能实施。创建相同顺序filed到document可以增加索引的优化次数,对构建索引和搜索都是性能得提升
h、在analyzer内复用同一个Token实例。
analyzer通常都为序列中的每个term创建一个新的Token实例。你可以通过复用同一个Token实例的方法大幅节约GC的开销
i、在Token中使用char[] API取代String API来展现记号文本。
在Lucene 2.3中,Token可以把他的文本用一个char数组的片段来表示,这可以节省GC的在new和回收String实例时造成的开销。通过复用同一个Token实例以及char[] API你可以避免每个词新建的所有对象。
j、打开IndexWriter时,使用autoCommit=false选项。
在Lucene 2.3中,包含了对保存字段和词向量的文档的显著优化,可以减少对非常大索引文件的合并操作。对一个长时间运行的IndexWriter使用 autoCommit=false选项,你就可以得到显著的性能提升。注意,然而这样的话,搜索器就只能在IndexWriter关闭的时候才能读取到索引的变化;如果你非常需要在写入索引的同时可以搜索到最新更新的内容,那么你应该使用autoCommit=true选项,或者周期性的关闭和重新打开writer。
k、不去索引大量小文本字段,而是把文本聚合成一个单一的“内容”字段(你还是可以索引其他的字段)。
l、增大mergeFactor(合并因子),但是不要太大。
mergeFactor越大段的合并则越晚,因为合并是索引中开销很大的一部分,所以这样做可以提高索引的速度。然而,这将降低搜索的速度,如果太大的话,你可能会耗尽文件描述符。太大的值也可能减缓索引速度,因为一次性合并越多的段,意味着越多的磁盘寻道。
m、关闭所有你并未使用的特性。
如果你存储了字段,但是查询期间并不使用的话,那么不要存储他们。词向量亦如是。如果你索引了太多的字段,关闭这些字段的norm可以提高性能。
n、使用更快的analyzer。
有时候,分析一个文档会花很长时间。例如,StandardAnalyzer非常耗时,尤其是在Lucene 2.2以下的版本的。如果你可以使用一个简单的analyzer,那么用它吧。
o、加速document构建。
从外部系统(数据库,文件系统,爬虫爬取的网站)获取一个document内容的常常是非常耗时的。
p、除非你真的需要(更快的搜索),否则不要优化。
q、 多个线程使用一个IndexWriter。
现代硬件高度并行(多核CPU,多通道内存架构,硬盘的内建指令队列,等等)。所以使用多线程添加文档多半会更快。即使是老的电脑,也经常在IO和CPU间存在并发。测试线程的数量选择性能最好的线程数量。推荐jdk1.5的线程池
r、索引分开不合并。
如果你的索引内容非常的多,你可以把你的内容分为N块,在不同的机器索引每个块,然后使用writer.addIndexesNoOptimize把它们和并为最终索引。
s、使用Java profiler。
如果这些都失败了,profile你的程序找出时间耗费在哪里。我成功使用过一个非常简单的profiler叫做JMP。有很多java的profiler。往往你会很意外的发现,一些愚蠢的、意想不到的方法花费了那么多的时间。
3、API 优化后还需要针对一些业务点进行优化
构建索引的SQL脚本调优
更改全量索引的方式
我们产品线全量索引是通过分页的方式去抓取数据并构建成索引,大数据量构建索引分页抓取数据是很愚蠢的方式,这个增加跟数据库的交互次数,导致数据库压力上去,而且性能很差,可以考虑通过游标的方式一次将数据全部load到数据库缓存中,通过游标去抓取一批构建索引
4、性能优化前后性能对比(性能测试)
通过性能测试去分析优化前后的差距,这个后期有时间分享吧
这里面很多是apache官网总结的,总结的很好,我也是参考实现的,具体参考官网
http://wiki.apache.org/lucene-java/ImproveIndexingSpeed
相关推荐
使用其他编程语言访问Lucene Lucene管理和性能调优等内容 最后还提供了三大经典成功案例 为读者展示了一个奇妙的搜索世界 《Lucene实战 第2版 》适合于已具有一定Java编程基本的读者 以及希望能够把强大的搜索...
通过合理配置和调优,可以显著提高系统性能。 6. **Lucene 3.30版本** Lucene 3.30是该库的一个较早版本,它可能包含一些特定的功能和API。随着版本迭代,Lucene引入了更多的特性,如多字段搜索、更高效的内存管理...
10. **性能调优**:通过分析源码,开发者可以了解到如何调整各种参数,如缓存大小、合并策略等,来优化Lucene的性能。 总的来说,深入学习Lucene 3.5.0的源码,可以帮助开发者掌握全文检索的核心技术,了解其内部...
**Lucene.NET 中文分词技术详解** Lucene.NET 是一个高性能、全文检索库,它是Apache Lucene项目在.NET平台上的实现。...开发者可以根据实际需求选择适合的分词器,并通过集成和调优提高系统的搜索效率和用户体验。
包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本、Lucene的高级扩展、使用其他编程语言访问Lucene、Lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为...
包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本、Lucene的高级扩展、使用其他编程语言访问Lucene、Lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为...
- **性能调优**:根据实际情况调整Lucene的配置参数,如缓存大小、分词器设置等,以达到最佳性能。 通过上述步骤,我们可以构建一个基于Lucene的增量索引系统,高效地处理数据变化,同时保持搜索效率。在实际应用中...
包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本、Lucene的高级扩展、使用其他编程语言访问Lucene、Lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为...
《Lucene in Action》详尽地介绍了Lucene的各个方面,从基础到高级特性,涵盖了索引优化、性能调优和复杂查询语法等主题。而《Lucene的搜索引擎设计与实现》则深入剖析了搜索引擎的设计原理,通过实例展示了Lucene...
包括认识lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用tika提取文本、lucene的高级扩展、使用其他编程语言访问lucene、lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为...
10. **性能调优**:最后,了解如何监控和调优Lucene的性能,包括索引和查询速度、内存使用情况等,是确保项目稳定运行的关键。 综上所述,基于Lucene的JavaEE项目开发涉及众多技术点,从基础的索引创建到复杂的查询...
六、性能调优 Lucene提供了丰富的配置选项,用于调整索引和查询性能。例如,选择合适的字段类型、设置缓存策略、优化内存分配等,都可以在保持搜索准确性的前提下,提升系统的整体性能。 七、实战演练 通过实践项目...
- 性能调优:根据服务器资源和数据量,适当调整Lucene的索引设置,如分块大小、内存缓冲等。 以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据...
4. 性能调优:通过缓存、多线程等方式提高搜索性能。 5. 集成应用:将Lucene.NET集成到ASP.NET、WPF、WinForms等.NET应用程序中,实现全站搜索。 五、未来发展趋势 虽然目前最新的Lucene.NET版本已经更新至4.x,但...
这些PPT可能会包含以下内容:如何搭建一个简单的Lucene应用,如何创建、索引和搜索文档,以及如何进行性能调优。它们也可能涵盖高级主题,如分布式搜索(例如通过Solr或Elasticsearch)、近实时搜索、多字段排序和...
此外,博主可能还会介绍如何处理异常、性能调优技巧以及如何使用Lucene与其他Java库(如Spring、Hibernate等)集成。 总之,Java Lucene工具类是开发者实现全文搜索功能的强大助手,通过博主的示例,我们可以学习到...
- **性能调优**:根据实际应用场景调整Lucene配置,如缓存策略、内存分配等。 Windows Lucene 8.11.0的发布,意味着开发者有了一个更强大、更可靠的工具来实现高效、精准的全文搜索。无论是初学者还是经验丰富的...
5. **优化和调优**:根据实际需求,可能还需要进行一些优化工作,例如调整`HanLP`的分词参数,或者对`Lucene5`的索引配置进行微调,以提高搜索效率和精度。 在`Lucene5DemoHanLP`这个压缩包中,应该包含了实现上述...
2. 性能调优:调整缓存大小、使用多线程进行索引构建和搜索等方法可以提升性能。 3. 更新管理:当原始数据发生变化时,Lucene提供更新和删除文档的功能,确保索引与数据同步。 4. 扩展性:Lucene支持分布式搜索,...
#### 九、管理与性能调优 - **索引维护**:定期进行索引优化,减少存储空间占用。 - **查询优化**:通过调整查询参数和算法来提高搜索效率。 - **资源管理**:合理分配硬件资源,确保系统的稳定运行。 #### 十、...