索引过程和搜索过程
来源:互联网 发布:丹尼爱特牌子好吗知乎 编辑:程序博客网 时间: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排序
相对比较简单,不再赘述
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排序
相对比较简单,不再赘述
- 索引过程和搜索过程
- Lucene 索引和搜索过程
- lucene-索引过程和搜索过程的核心类
- lucene 3.4索引和搜索过程中核心类
- LuceneInAction-理解索引和搜索过程的核心类
- ES-索引过程和检索过程
- OSChina 的全文搜索设计说明 —— 索引过程
- 搜索学习基础--倒排索引的过程解读
- 搜索学习基础--代码模拟倒排索引过程
- Lucene文件格式和索引过程分析
- 索引,视图和存储过程的利弊
- mysql数据库索引和存储过程
- Mysql索引概念和存储过程
- mysql视图,索引和存储过程
- lucene-索引的优化和索引过程查看
- Firtex索引过程
- sql 索引 存储过程
- lucene索引过程详解
- ClearCase完全攻略(二) Base下的一些概念全解析
- 处理过程中页面遮挡的技术
- MFC打开/保存文件对话框:CFileDialog
- 学习Linux遇到的问题
- 在QT4中使用QTableView制作属性编辑器
- 索引过程和搜索过程
- 数据从Excel中上传
- 【转】数据库锁表的分析与解决
- Excel中文件插入到数据库
- 汽车价格会走入下跌区间
- 嵌入式linux下usb驱动开发方法--看完少走弯路
- ftp下载
- 内存设计考虑的要点
- [sql server] 执行计划的缓存和重新使用