索引过程如下:
创建一个IndexWriter 用来写索引文件,它有几个参数,INDEX_DIR 就是索引文件所
存放的位置,Analyzer 便是用来对文档进行词法分析和语言处理的。
创建一个Document 代表我们要索引的文档。
将不同的Field 加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,
修改时间,内容等。不同类型的信息用不同的Field 来表示,在本例子中,一共有
两类信息进行了索引,一个是文件路径,一个是文件内容。其中FileReader 的
SRC_FILE 就表示要索引的源文件。
IndexWriter 调用函数addDocument 将索引写到索引文件夹中。
搜索过程如下:
IndexReader 将磁盘上的索引信息读入到内存,INDEX_DIR 就是索引文件存放的位
置。
创建IndexSearcher 准备进行搜索。
创建Analyer 用来对查询语句进行词法分析和语言处理。
创建QueryParser 用来对查询语句进行语法分析。
QueryParser 调用parser 进行语法分析,形成查询语法树,放到Query 中。
IndexSearcher 调用search 对查询语法树Query 进行搜索, 得到结果
TopScoreDocCollector。
Lucene 的索引过程,就是按照全文检索的基本过程,将倒排表写成此文件格式的过程。
Lucene 的搜索过程,就是按照此文件格式将索引进去的信息读出来,然后计算每篇文
档打分(score)的过程。
1、找到符合查询的document(hits)
Searcher.search(Query, ...)
new Hits(Searcher, Query, Filter, ...)
Hits.getMoreDocs(int)
Searcher.search(Weight, Filter, int, ...)
Searcher.search(Weight, Filter, HitCollector)
Weight.scorer(IndexReader)
IndexReader.termDocs(Term):得到hits
2、为document打分
Similarity.idf(Term, Searcher)得到idf
Similarity.coord(int, int)得到coord(q, d)
Query.getBoost()得到t.getBoost()和/或q.getBoost()
Query.weight()中执行以下步骤:
通过Weight.sumOfSquaredWeights()得到sumOfSquaredWeights
通过Similarity.queryNorm(sumOfSquaredWeights)得到queryNorm(q)
通过Weight.normalize(queryNorm)得到中间值(这里的计算比较复杂,会用到t.getBoost(), q.getBoost(), idf等值)
Scorer.score()中执行以下步骤:
通过TermDocs得到frequency
通过Similarity.tf(frequency)得到tf(t in d)
通过Similarity.getNormDecoder()得到norm(t,d)
通过Weight.getValue()得到中间值
由中间值、tf(t in d)和norm(t,d)得到最终得分
3、为document排序
相对比较简单,不再赘述