索引过程和搜索过程

来源:互联网 发布:丹尼爱特牌子好吗知乎 编辑:程序博客网 时间:2024/05/16 00:36

索引过程如下:
 创建一个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)的过程。

 

 

 

 

 

 

 

 

 

 

 

Lucene执行查询的过程非常错综复杂,不同的对象之间的耦合度很高,关系比较乱,经过仔细的分析,得到大致的流程如下(不同的Weight, Scorer, Query等可能略有区别),方便开发者在此基础上修改源码

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排序
相对比较简单,不再赘述
原创粉丝点击