我今天学习了lucene的一些知识,我做了简单的笔记:
索引文件结构:
倒排索引,索引对象是文档中的单词等,用来存储这些单词在一个文档中的位置。例如,有些书在最后提供的索引(单词——页码的对应列表),就可以看成是一种倒排序索引。可以通过一些关键字,在全书中检索出与之相关的部
索引文件的检索与维护
词汇表规模相对较小,文档集合规模较大。进行检索时,先从检索词汇表开始,然后找到相对应的文档。如果查询中仅包含一个关键词,则在词汇表中找到该单词,并取出他对应的文档就可以了。如果查询中包含多个关键词,则需要将各个单词检索出的记录进行合并。
维护倒排索引有三个操作:插入、删除和更新文档。但是更新操作需要较高的代价。因为文档修改后(即使是很小的修改),就可能会造成文档中的很多的关键词的位置都发生了变化,这就需要频繁的读取和修改记录,这种代价是相当高的。因此,一般不进行(真正的)更新操作,而是使用“先删除,后创建”的方式代替更新操作。
Lucene常用的API:
Document :Lucene所操作的对象
Field:组成Document的元素,代表一个属性。Store、Index
new Field( String name, String value, Store store, Index index )
Directory:索引库(目录)
FSDirectory :真实的目录
RAMDirectory:在内存中的一个虚拟的目录
QueryParser:把查询字符串变为查询对象的工具。使用子类: MultiFieldQueryParser
new MultiFieldQueryParser(String[] fields, Analyzer a)
Term:代表某个属性中的一个关键词(目录中出现的条目),是搜索的最小单位
Query :查询对象(封装的过滤条件)。有很多子类,对应各种各样的查询方式。
TopDocs(一套) :代表查询结果
// 添加索引
addDocument( Document doc )
// 更新
updateDocument(Term term, Document doc)
// 删除
deleteDocument(Term term)
// 合并索引库
addIndexesNoOptimize(Directory[])
// 优化索引库
optimize()
日期时间与数字类型的使用
在对属性值进行大小比较时(通常是使用范围查询,比较数字类型的时候),是按照字符串的比较规则,因为他们都是转成字符串后存储的。这样就会出现问题,如 “20”是大于“100”的(根据字符串的比较规则)。解决的方法是:让数字转成的字符串具有相同的位数,如位数不足,就在前面补相应数量个“0”。数字到符串、字符串到数字的转换可以使用Lucene提供的工具类NumberTools完成。对于日期与字符串的双向转换,则可以使用Lucene提供的DateTools完成。
相关度排序
Lucene的搜索结果默认按相关度排序的。所谓相关度,就是文档的得分。Lucene有一个评分机制,就是对检索结果按某种标准进行评估,然后按分值的高低来对结果进行排序。
1, 文档的得分与用户输入的关键字有关系,而且是实时运算的结果。得分会受关键字在文档中出现的位置与次数等的影响。
2, 可以利用Boost影响Lucene查询结果的排序,通过设置Document的Boost来影响文档的权重,以达到控制查询结果顺序的目的:Document.setBoost(float)。默认值为1.0f,值越大,得分越高。
3, 也可以在查询时给Filed指定boost:Field.setBoost(float)。当同样的term属于不同的field时,如果field的boost不一样,其所属的文件的得分也不一样。