Lucene搜索引擎开发高级部分(索引的建立和优化)
1,文本的分析
对于不同的文本要使用不同的分析器
IndexWriter writer = new IndexWriter(indexPath,new StandardAnalyzer());
writer.addDocument(doc);
这是我们一般常用的方法,但是对于我们处理的文档中不仅含有中文文档(如还有法语)这样的情况,使用单一的分析器就会使得对于一种语言的文档分析的很好,而另外一种则不行,这样就要使用到addDocument方法的一个重载的方法:
writer.addDocument(doc,分析器实例);
2,分析器和解析器
解析器:
用来解析物理文件,从中提取所需的文本,如标题、正文、时间等,作用于物理文件。
常见的对word、excel、pdf等的解析。
分析器:
用来分析文本内容,或者说是分析文字。
3,分析器
Lucene自带的分析器:
1,WhitespaceAnalyzer
用于在空格处进行词语切分,将句子切分成词语块。
如:I love you切分成I,love,you
2,SimpleAnalyzer
在非字母字符处切分文本,并将其转换成小写形式。
如:I Love you切分成i,love,you
3,StopAnalyzer
在非字母字符处切分文本,然后小写化,再移除忽略词。
如:可爱的祖国,忽略词为“的”,切分成“可爱”和“祖国”
4,StandardAnalyzer
标准的分析器,基于某种语法规则,将文本切分成词语块。这种语法规则可以识别E-mail地址,首字母缩写词,汉语-日语-汉语字符,字母数字等。
5,其他
ChineseAnalyzer:单字切分
CJKAnalyzer:二分法切分
IKAnalyzer:词典法切分
6,可以开发自己的分析器
4,索引文件的格式
segments:索引块,其中含有只要的索引信息。
fum:存储了Field的名称。
fdt:存储了所有设置了保存属性(Store,YES)的Field数据
fdx:存储文档在fdt文件中为位置。
cfs:复合式索引格式的索引文件,相当于把多个索引文件合并起来,从而减少索引文件的数量。
5,索引的优化
建立索引就是为了搜索,搜索其实就是IO操作,当文件增大的时候IO操作会减慢,所以得优化。
优化的策略:
1,使用更好的硬盘
2,利用缓存减少磁盘读写频率。减少索引文件的大小和数量。(主要讲解)
(1)复合式索引格式
前面说的.cfs文件,是将所个索引文件合并起来的文件,从而减少索引文件的数量。
IndexWriter有setUseCompoundFile方法,通过这个方法可以设置是否使用复合式索引格式。默认是使用。
(2)调正索引优化参数
内存的IO速度比文件IO的速度快。所以我们可以现在内存中建立索引,然后将索引写到文件系统中。
Lucene有3个优化参数,可以优化磁盘写入频率和内存消耗
优化方式一:以下参数通过IndexWriter类来设定:
1,mergeFactor
控制索引块的合并频率和大小,默认值为10,Lucene默认在内存中存储10个Document对象,mergeFactor为10表示磁盘上的块数达到10的乘方时,Lucene会将这些块合并成一个段。(当Document对象到达10个的时候会合并成一个大的块,当大块到达10的话,会合并成一个更大的快......)到达一定Document的数量就合并成块的数量是由mergeFactor决定的
所以较大的mergeFactor适合批量的索引的情况,较小的mergeFactor适合交互性比较强的索引的情况。
较大的mergeFactor意味着低频率的合并,索引文件会增多,虽然这并不影响索引的性能,但是他会降低搜索的速度。
设置方法:IndexWriter的setMergeFactor(int mergeFactor)来设置mergeFactor的大小
2,maxMergeDocs
用来限制每个索引块的文档数量,默认的是Integer.Max_VALUE
设置方法:IndexWriter的setMaxMergeDocs(int maxMergeDocs)
3,maxBufferedDocs
用于限制内存中的文档数量,默认是10。这个值越大,在内存中存储的文档数量就越多,越消耗内存。同时磁盘IO越少。
maxBufferedDocs参数的意义在于使用更大的内存空间来换取更快的索引。
内存大的情况下,为了加快索引速度,我们要增大这个数的值。
设置方法:IndexWriter的setMaxBufferedDocs(int maxBufferedDocs)
优化方式二:以下是通过”先在内存中建立索引然后在写入到文件系统中“来实现索引的优化:
为了将索引在内存中缓存起来,我们需要一个”内存缓冲器“,需要IndexWriter的另一个构造器
public IndexWriter(Directory d,Analyzer a,boolean create) throws IOException
注意:第一个参数是Directory,他可以是RAMDirectory也可以是FSDirectory:
第一:如果是RAMDirectory表示在内存中建立索引,这样建立索引的速度很快,但是无法永久保存。
第二:如果是FSDirectory表示在硬盘中建立索引,可以永久保存,但是速度慢。
通过内存缓冲器将RAMDirectory的索引内容写到FSDirectory的步骤:
<1>建立基于RAMDirectory的索引。
RAMDirectory directoryInner = new RAMDirectory();
IndexWriter writer = new IndexWriter(directoryInner,new IndexWriterConfig(Version.LUCENE_36,
new StandardAnalyzer(Version.LUCENE_36)));
<2>向基于RAMDirectory的索引中添加文档。
String content = “hello world”;
Document doc = new Document();
doc.add(new Field("content",content,Field.Store.YES,Field.Index.ANALYZED));
writer.addDocument(doc);
<3>建立基于FSDirectory的索引。
FSDirectory directoryOut = FSDirectory.open(new File("F:\\Lucene\\example\\index03"));
IndexWriter writerOut = new IndexWriter(directoryOut,new IndexWriterConfig(Version.LUCENE_36, new StandardAnalyzer(Version.LUCENE_36)));
<4>把缓存在RAMDirectory中的所有的数据写入FSDirectory。
writerOut.addIndexes(new Directory[]{directoryInner});
writerOut.close();
优化方式三:索引本身的优化
IndexWriter的方法public void optimize() throws IOException
本方法用于将索引建立完成之后对索引文件进行合并的一种优化方式,该优化的好处只针对于搜索时的效率提高,对于索引的建立效率没有任何影响。
注意:索引优化比较耗时,所以建议在索引建立完毕之后进行优化,而不是在索引建立的时候进行优化。
Ps:IndexWriter的方法:
writer.setInfoStream(System.out);
这样设置之后在我们建立索引的时候,控制台就会打印出索引建立时的一些信息。对程序稍作修改就可以将信息输出到外部文件中,这样就行成了索引创建时的日志文件。这对于我们优化索引的建立有很大的帮助.
相关推荐
Lucene搜索引擎开发权威经典 光盘 于天恩 著 中国铁道出版社出版 2008-10 这本书基于Lucene的当前最新版本(2.1)精解了Lucene搜索引擎的相关知识,从基础知识到应用开发,精练简洁,恰到好处。 本书共包括16章,...
《Lucene搜索引擎开发权威经典》是由著名IT教育专家于天恩老师编著的一本深入解析Lucene搜索引擎开发的专业书籍。这本书结合源代码分析,详细介绍了如何利用Lucene进行信息检索和全文搜索的实现。Lucene是Apache软件...
《Lucene搜索引擎开发权威经典》是一本由于天恩编著的书籍,它深入浅出地介绍了如何使用Apache Lucene进行搜索引擎的开发。虽然作者在书中以轻松幽默的笔触来阐述复杂的概念,但读者反馈认为书中对于某些高级主题的...
这本书主要聚焦于LUCENE和JAVA这两种技术在搜索引擎开发中的应用,为读者揭示了搜索引擎背后的复杂机制和实现细节。 LUCENE是一个开源的全文检索库,由Apache软件基金会维护。它是Java编写,提供了高效的文本搜索...
《lucene+nutch搜索引擎开发源码1》是一个包含开源搜索引擎项目Lucene和Nutch源代码的压缩包,主要针对搜索引擎开发的学习和实践。这个压缩包是书籍《lucene+nutch搜索引擎开发》的一部分,由于源码量较大,因此分为...
总结来说,“lucene搜索引擎demo”提供了一个完整的示例,涵盖了从数据抓取、分词处理到建立和使用Lucene索引的全过程。通过对这个demo的学习,开发者可以快速理解并掌握Lucene搜索引擎的使用,进一步应用于实际项目...
《lucene搜索引擎开发权威经典》一书的光盘源代码包含了大量的示例和实践项目,是深入了解和学习Apache Lucene搜索引擎技术的重要资源。Lucene是一个高性能、全文本搜索库,由Java编写,广泛应用于各种搜索应用中。...
Lucene 搜索引擎开发现实文档 Lucene 是一个开源的高性能的信息搜索库(IR Information Retrieval Library),主要用于全文搜索和信息检索。以下是 Lucene 的详细知识点: Lucene 基础回顾 1. 数据检索的问题:...
《开发自己的搜索引擎——Lucene+Heritrix》是一本深入探讨如何构建自定义搜索引擎的书籍,结合了Apache Lucene和Heritrix两个强大的开源工具。Lucene是Java开发的全文检索库,而Heritrix则是一款功能丰富的网络爬虫...
Regain是一个基于Apache Lucene的全文搜索引擎,它提供了高级的搜索功能,能够帮助用户快速、准确地在大量数据中查找所需信息。Lucene是Java语言实现的一个开源信息检索库,为开发人员提供了一个强大的文本分析和...
通过这个简单的 Lucene 示例,你可以了解搜索引擎的基本操作,并为进一步学习 Lucene 的高级特性和优化技巧打下基础。随着深入,你还可以探索多字段搜索、布尔查询、短语查询、模糊匹配、近似搜索、自定义评分函数等...
Lucene.NET是一个强大的全文搜索引擎库,它允许开发人员在应用程序中集成高级搜索功能。本文将详细介绍如何使用Lucene.NET对数据库进行索引创建以及实现高效的搜索功能。 首先,我们需要了解Lucene.NET的基本概念。...
然而,随着数据量的增长,性能优化、分布式索引、实时索引等挑战也随之而来,需要开发者灵活运用Lucene的高级特性以及与其他技术(如Solr、Elasticsearch)的集成来解决。 总的来说,“基于lucene 的简单搜索引擎....
《搜索引擎Lucene+Heritrix(第二版)4》是一本深入探讨搜索引擎技术的专业书籍,主要围绕两个核心组件——Lucene和Heritrix展开。Lucene是Apache软件基金会的一个开源全文检索库,而Heritrix则是一个网络爬虫工具,...
此外,书中可能还包含了对其他相关技术的介绍,如信息检索理论、自然语言处理、数据存储和分布式计算等,这些都是搜索引擎开发中的关键组成部分。通过对这些内容的深入学习,开发者可以进一步优化搜索引擎的性能,...
《Lucene.Heritrix:开发自己的搜索引擎(第2版)》...通过阅读《Lucene.Heritrix:开发自己的搜索引擎(第2版)》,读者将能够掌握构建搜索引擎的关键技术和技巧,从而能够设计和实现适合自己特定需求的搜索解决方案。
《深入剖析Lucene 2.0.0搜索引擎源代码》 Lucene是一个开源的全文检索库,由Apache软件基金会开发并维护。它提供了一个高效、可扩展的信息检索库,允许开发者轻松地在他们的应用程序中添加全文搜索功能。本文将重点...
总结,Compass作为基于Lucene的搜索引擎框架,为Java开发者提供了更为便捷的全文搜索解决方案,降低了搜索引擎开发的复杂度,提高了开发效率。理解并掌握Compass,有助于在实际项目中更好地利用全文搜索技术提升用户...
此外,书中可能还会讨论搜索引擎的高级话题,如查询优化、相关性排名(如TF-IDF算法)、分布式索引和搜索、以及如何应对动态更新的网页数据。这些内容对于开发一个实际的、高性能的搜索引擎至关重要。 总的来说,...