参考:Lucene5.5学习(2)-Lucene全文检索的基本原理-腾讯云开发者社区-腾讯云
1、lucene是一个搜索引擎工具包,不是一个完整的搜索引擎。
2、名称解释:
Document:文档
Field:文档的某个属性
Analyzer:分词器,把分词内容交给IndexWriter建立索引
IndexWriter:把Document写入索引
Directory:索引存储位置。两个实现:FSDirectory & RAMDirectory
FSDirectory:一个存储在文件系统中的索引的位置
RAMDirectory:一个存储在内存当中的索引位置
Query:把用户输入的查询字符串封装成Lucene能识别的query,实现:TermQuery,BooleanQuery,PrefixQuery。
IndexSearcher:在建立好的索引上进行搜索。以只读的方式打开一个索引,可以多个IndexSearcher实例在一个索引上进行操作。
Hits:保存搜索结果。
Tokenizer:分词组件
Document Frequency:文档频次,多有文件包含Term
Frequency:词频率,文件中包含了几个此Term。
Stemming:词干提取
Lemmatization:词形还原
3、全文搜索相对于顺序扫描的优势之一:一次索引,多次使用。
4、创建索引过程
1)tokenizer将文档分成一个一个单独的单词;去除标点符号;去除停词(stopword),得到词元Token。
2)将Token传给语言处理组件Linguistic Processor,lowercase,stemming,lemmatization,得到词Term。
3)将Term传给索引组件Indexer,创建一个字典,然后排序,合并相同的Term,成为文档倒排Posting List链表。
分词组件(Tokenizer),都有一个停词(stop word)集合。
5、索引搜索过程:
1)用户输入
2)对输入进行词法分析,语法分析,语言处理。
词法分析:识别单词和关键字,
语法分析:语法规则形成一颗语法树。
语言处理:同索引创建过程。
3)搜索得到文档:反向索引表中找到关键字的文档链表,合并链表,
4)根据文档和查询语句的相关性,对结果进行排序。
A:找出词(Term)对文档的重要性的过程称为计算词的权重(Term weight)的过程。
B:判断词(Term)之间的关系从而得到文档相关性的过程应用一种叫做向量空间模型的算法(Vector Space Model)。
=》计算词的权重Term Weight
两个关键因素:Term Frequency & Document Frequency
Term Frequency ,tf越大说明越重要;
Document Frequency,df越大说明越不重要,太普通。
w=tf * log(n/df)
w:权重
n:总文档
=》向量空间模型的算法
文档中Term的权重,查询语句中term的权重,根据公式计算
6、索引文件结构
1)Index索引:一个索引放到一个文件夹中,所有文件构成一个Lucene索引。
2)Segment段:一个索引包含多个段,段与段是独立的,添加新的文档可以生成新的段,不同改的段可以合并。Segments.gen和segments_x是段的元数据文件,保存了段的属性信息。
3)Docment文档:建立索引的基本单位。
4)Field域:不同类型信息,比如标题,时间,正文,作者等
5)Term词,索引的最小单位,经过词法分析和语言处理后的字符串
Segments_3:保存索引包含多少段,每个段包含多少文档。
Write.lock:防止多个IndexWriter同事写到一份索引文件中。
7、正向索引,反向索引
正向索引:Index->segment->Docment->Field->Term
反向索引:Term->Document
8、加权重
更高版本不支持在生成索引时增加文档或者域的权重,而是在查询时设置查询域权重。