很多人会抱怨 Lucene 在数据量增加到一定规模的时候,性能会出现明显下降,对于并发用户访问的支持能力也比较弱。其实在工程师所遇到的绝大多数环境下 Lucene 的性能问题,往往是因为系统没有经过良好的调优。而非简单的 Lucene 设计缺陷所造成。
当前使用 Lucene 的知名网站包括,Stack Exchange,旗下全球最大的事实性问答网站 StackOverFlow.com .
基于 Lucene 文档 “How to make indexing faster”,我们可以看到如下经验可能可以应用于 Lucene 优化。
确定的确需要进行索引性能调优
很多场景之下,性能问题其实表现为整体数据架构设计的问题,而不仅仅是通过索引所可以解决的。在决定进行索引性能调优之前,可能需要首先判断,是否数据架构上出现了情况。
确定在使用最新版本的Lucene
Lucene也是在不断发展之中。新版本的Lucene通常性能都会有些改善。
使用更快的硬件,例如,改善IO系统性能
通常硬件性能的改善对于系统整体性能提升是立竿见影的。例如,通过SSD硬盘(Solid-State Disk,固态硬盘)取代通常的 SATA 或者 SAS 硬盘,将可以获得明显的系统性能提升。
在建立索引过程中,使用单例的 Writer
基于内存执行 Flush 而不是基于 document count
在 Lucene 2.3 及其以上系统中,IndexWriter可以基于内存执行Flush操作。调用 writer.setRAMBufferSizeMB() 可以设置Buffer大小。
尽量多使用内存
内存越多,Lucene应对海量数据的时候性能明显加强。
关闭复合文件格式(Compound file format)
调用 setUseCompoundFile(false),可以关闭。建立复合文件,将可能使得索引建立时间被拉长,有可能达到7%-33%。而关闭复合文件格式,将可能大大增加文件数量,而由于减少了文件合并操作,索引性能被明显增强。
重用文档与字段实例
这是在 Lucene 2.3 之后才有的一个新技术。在之前如果要修改某个记录,需要删除掉索引中的文档,然后重新添加。而新的方法通过 setValue 实现。这将有助于更有效的减少GC开销而改善性能。
在存储字段数据以及执行 term vectors 的时候,使用同样的字段顺序添加文档
这样将有助于保证合并操作的性能。
在Analyzer中重用单例的Token
在表示 Token 文本内容的时候,使用 char[] API 而不要使用 String API
显然 char 的结构更简单,而操作也更加快速。基于String的性能通常都不怎么好。
在打开 IndexWriter 的时候,设置 autoCommit = false
同传统的数据库操作一样,批量提交事务性能总是比每个操作一个事务的性能能好很多。
同样,对于实时性要求不是很强的系统。通过标记,并定时进行索引和优化,也将比随时进行索引操作性能能改善很多。
不要使用太多的小字段,如果字段过多,尝试将字段合并到一个更大的字段中,以便于查询和索引
适当增加 mergeFactor,但是不要增加的太多。
关闭所有不需要的特性
使用更快的 Analyzer
特别是对于中文分词而言,分词器对于性能的影响更加明显。
加快文档的构造速度
通常,从数据库,文件系统,或者网络爬行过程中,都可能因为上游程序处理的性能而影响 Lucene 文档建立的速度。
除非真的需要改善索引性能,通常不要特别进行优化
对于一个实例的 IndexWriter 可以使用多线程或者并发技术
使用Java Profiler分析 Lucene 和调用程序的性能,并由此改善性能
- 浏览: 38796 次
- 性别:
- 来自: 北京
相关推荐
Lucene索引深入优化 Lucene索引搜索 第3章 Lucene搜索实战 Lucene搜索实战 Lucene搜索深入实战 Lucene搜索深入实战进阶 第4章 Lucene高级 Lucene高级进阶 Lucene排序 Lucene过滤 Lucene分词器
最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统...
Lucene是一个高性能的、可扩展的信息检索工具。你可以把它融入到应用程序中以增加索引和搜索功能。Lucene是一个纯Java实现的成熟、自由、开源的软件项目。 它不是一个完整的全文检索引擎,而是一个全文检索引擎的...
Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的...总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。
最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统...
使用其他编程语言访问Lucene Lucene管理和性能调优等内容 最后还提供了三大经典成功案例 为读者展示了一个奇妙的搜索世界 《Lucene实战 第2版 》适合于已具有一定Java编程基本的读者 以及希望能够把强大的搜索...
包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本、Lucene的高级扩展、使用其他编程语言访问Lucene、Lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为...
基于MySQL和Lucene的反向索引系统的实时性能比较研究,刘一洲,徐鹏,搜索引擎是当今互联网使用最频繁的应用之一。为用户提供及时的,甚至是实时的信息索引是当今搜索引擎所要面对的首要挑战。倒排索
MySQL和Lucene都可以对数据构建索引并通过索引查询数据,一个是关系型数据库,一个是构建搜索引擎(Solr、ElasticSearch)的核心类库。两者的索引(index)有什么区别呢?以前写过一篇《Solr与MySQL查询性能对比》,...
基于Java的全文索引引擎.doc lucene测试代码.txt lucene为数据库搜索建立增量索引.txt ... lucene性能.txt 大富翁全文索引和查询的例子程序.txt 关于lucene2.0的创建、检索和删除功能的完整实现.doc weblucene.txt
性能优化也很重要,因为如果要索引的文件比较大的话,建立索引的性能就会很大的下降,你可以调整IndexWriter的几个参数来优化索引性能,还有可以用IndexWriter.Optimize()方法(这个方法主要是优化查询速度,反而使...
包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本、Lucene的高级扩展、使用其他编程语言访问Lucene、Lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为...
实验结果表明,Crypt-Lucene与SSE-1相比,索引构建时间减少了约为60%,同时具有较好的空间性能,对于大文档集合,利用MapReduce在4结点构成的Hadoop集群上并行构建8个Crypt-Lucene索引能减少83.4%的时间。
(6) 手动优化 6 2.6 索引文件作用 7 第三章 搜索功能 8 3.1 简单搜索 8 (1) 创建IndexReader 8 (2) 创建IndexSearcher 8 (3) 创建Term和TermQuery 9 (5) 根据TopDocs获取ScoreDoc 9 (6) 根据ScoreDoc获取相应文档 9 ...
对sqlserver数据库表,用多线程,高速创建索引。性能很高。参数灵活
Lucene是一个高性能、可伸缩的信息搜索(IR)库。它使你可以为你的应用程序添加索引和搜索能力。Lucene是用java实现的成熟的、免费的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于在Apache软件许可 [ASF, ...
Lucene是用java实现的、成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件许可 [ASF, License]。...Lucene是一个高性能、可伸缩的信息搜索(IR)库。它可以为你的应用程序添加索引和搜索能力。
包括认识lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用tika提取文本、lucene的高级扩展、使用其他编程语言访问lucene、lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为...
包括认识Lucene、建立索引、为应用程序添加搜索功能、高级搜索技术、扩展搜索、使用Tika提取文本、Lucene的高级扩展、使用其他编程语言访问Lucene、Lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为...
其次,利用内存索引和多线程并行处理技术提高Lucene创建倒排索引效率,并依据地名类别和显示优先级属性优化了检索结果相关度排序策略。最后,开发了一套具有快速搜索和地图定位展示的Web地名检索系统,使用500万条...