1. Lucene介绍
Lucene是apache下的一个开源的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
它为软件开发人员提供一个简单易用的工具包(类库),以方便的在目标系统中实现全文检索的功能。
全文检索
全文检索首先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
Lucene的优点
- 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
- 在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
- 优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
- 设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
- 已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
2. Lucene检索流程
- 创建索引流程:Gather Data(采集数据) –> 构造文档对象 –> 分词 –> 创建索引并存入索引库
- 搜索流程:用户发起搜索请求 –> 创建查询对象 –> 从索引库中搜索 –> 渲染并返回搜索结果
3. 索引的逻辑结构
- 一个非结构化的数据统一格式为
document
文档,一个document
可以有多个field
。 - 当用户搜索时,Lucene会从索引域中搜索,并找到对应的
document
,将document
中的filed
进行分词,然后根据分词创建索引。
4. 创建索引
创建索引的流程
- IndexWriter是核心对象,它可以完成创建索引、更新索引、删除索引等操作。
- Directory负责对索引进行存储,它是一个抽象类,子类为FSDirectory(文件中存储)、RAMDirectory(内存中存储)
创建索引
|
|
5. 搜索索引
使用QueryParse
|
|
使用Query的子类
TermQuery
TermQuery使用搜索关键词进行查询。
|
|
NumericRangeQuery
数字范围查询
|
|
BooleanQuery
布尔查询,用于组合条件查询。
|
|
- MUST和MUST表示“与”的关系,即“交集”。
- MUST和MUST_NOT前者包含后者不包含。
- MUST_NOT和MUST_NOT没有结果,没有意义。
- SHOULD与MUST表示MUST,SHOULD失去意义。
- SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
- SHOULD与SHOULD表示“或”的概念。
6. 删除索引
|
|
7. 修改索引
在Lucene中修改索引即是替换索引,先将原来的索引删除,再保存新的索引。
|
|
8. 相关度排序
Lucene通过计算Term的权重,对查询关键字和索引文档的相关度进行打分,分越高的就排在越前面。
影响Term的权重有两个因素:
- Term Frequency:Term在文档中的出现频率,次数越多,则代表这个Term对该文档越重要,即权重越高。
- Document Frequency:指多少文档包含这个Term的频率,频率越高,则代表这个Term越不重要,即权重越低。
手动设置权值
在创建索引时设置权值
|
|
在搜索时设置权值
|
|