Lucene核心包解析
1、 analysis:对需要建立索引的文本进行分词,过滤等操作。
2、 document:提供对document和field的各类操作。
3、 index:最重要的包,提供建立索引时的各类操作。
4、 queryParse:提供检索时的分析支持(如:确定检索词之间的逻辑与或非关系等)。
5、 search:负责检索的包,在建立索引后,利用该包对索引进行检索。
6、 store:提供对索引存储的支持(如:FSDirectory和RAMDirectory)。
在调用IndexWrite对象的addDocument()方法后,只有最后调用close()才会将索引写入磁盘中(当然,当内存中的Document数量达到一定值后,也会写入磁盘),另外,可以在调用close()前调用optimize()方法进行索引优化
Lucene的Document代表一个需要进行索引的“单元”,任何需要进行索引的文件都必须转换成document对象,才能被索引和搜索到。
Lucene的Field提供了用户处理的方式,包括“是否分词”、“是否索引”、“是否存储”三种处理方式。由此,Field静态方法中提供了四种不同类型的字段类型。
1、 Text类型:被切词和索引的内容,有Field.Text(String, String)和Field.Text(String, Reader),如果参数是Reader,则数据源内容不被存储,若是String,则被存储。
2、 KeyWord类型:不被切词,但被索引并且完整地存储在索引中(适合于链接地址URLs、文件系统路径信息、时间日期、人名、身份证号码、电话号码等)
3、 UnIndexed类型:不被切词,也不被索引,但其值会被原封不动地存储在索引中(适合于处理需要和搜索结果显示在一起的内容,比如在对一个网页建立索引时,可以将这个网页的URL添加到UnIndexed类型的字段中,这样,在搜索到与该网页相关内容时,就可以将这个引用地址与搜索结果一起显示出来)
4、 UnStrord类型:与UnIndexed恰好相反,它会被分词和索引,但不被存储在索引中(适合于不需要以原有形式重现原始数据的大规模文本,比如网页的主体部分或者内容巨大的文本文档)
IndexWriter用于索引建立,加入Document,合并各种索引段,以及控制与索引相关的各方面。
性能调整参数:
1、mergeFactor:用于控制Lucene在把索引从内存写入磁盘上的文件系统时内存中最大的Document数量,同时,还控制内存中最大Segment数量。
2、maxMergeDocs:用来限制一个Segment中最大的文档数量。
3、minMergeDocs:用于控制内存中持有的文档数量,即内存中被“刷”到磁盘前的数量,对磁盘上的Segment大小没有任何影响。
4、maxFieldLength:对Field的长度进行限制。
Segment是Lucene索引文件最基本的单位,一个Segment是一个独立的索引,可以由IndexSearch进行单独的查找。Lucene的工作其实就是不停地往磁盘中加入新的Segment,然后再按一定的算法合并不同的Segment以创建一个新的段。Segment的前缀命名规则是:将segmentInfors.counter值(该值其实表示的就是当前segment中总的文档数量)先加1后转换成36进制,然后在前面加上下划线,
多索引文件格式VS复合索引格式:相互转化(P236)
索引合并addIndexes()
Lucene索引优化:通过合并磁盘上的索引文件,以便减少文件的数量,从而减少搜索索引的时间。IndexWrite的optimize()方法就是来对索引进行优化的,它将磁盘上的多个Segment进行合并,组成一个全新的Segment。通常情况,该优化应该在对大批量索引建立完成之后再进行调用。(P245)
IndexSearcher类对索引进行检索,最终使用IndexReader类来作为实际的索引目录读取器。
Lucene检索结果的集合是用Hits类的实例进行表示。
构建各种Query:
1、 TermQuery:按词条搜索,最常用的Query
2、 BooleanQuery:“与或”搜索,实质为一个组合的Query,使用时可以把各种Query对象添加进去并标明它们的逻辑关系
3、 RangeQuery:在范围内搜索
4、 PrefixQuery:前缀搜索
5、 PhraseQuery:多关键字搜索
6、 PhrasePrefixQuery:短语前缀搜索,在PhraseQuery中,如果用户想查找短语“david robert ”, 又想查找短语“mery robert”,那么他就只能构建两个PhraseQuery,然后使用BooleanQuery将它们作为其中的字句,并使用“或”操作符连接,这样就能达到需要的效果,PhrasePrefixQuery可以很方便地实现这种需要
7、 FuzzyQuery:模糊查询,可以简单地识别两个相近的词语
8、 WildcareQuery:通配符搜索
查询字符串解析QueryParser类:对于搜索引擎(google,百度)来说,很多情况下用户只需输入所需查询的内容,然后点击“搜索”就可以了,其余的事全部交给引擎处理,QueryParser正是处理用户输入的字符串,其作用就是把各种用户输入的字符串转化为一个内部的Query或者Query组。虽然Lucene提供的API允许创建各种各样的Query查询语句,但它同时允许通过QueryParser查询分析器生成各种各样的Query子对象。当用户输入两个关键字时,QueryParser默认它们之间为“或”关系。
Analyzer分析器,其实就是实现“分词”和“过滤”,分词器和过滤器分别是通过Tokenizer和TokenFilter类的子类来实现。所有Analyzer均继承自org.aparhe.lucene.analysis.Analyzer这个抽象基类。
MultiFieldQueryParser多域搜索
MultiSearcher同时搜索多个索引
ParallelMultiSearch多线程搜索
搜索结果的过滤
1、 DataFilter日期过滤器
2、 QueryFilter查询过滤器,使用一个查询返回的检索结果来限制在一个后续查询中可以得到的检索内容,并且在QueryFilter中使用了缓存。
3、 CachingWrapperFilter带缓存的过滤器,可用于包装一个没有使用缓存的过滤器,就使其可以自动具有缓存的功能