lucene是一个java编写的开源的全文检索引擎,是一个框架,一套api,是一个核心模块,并不包括用户交互、高亮结果等外围模块。
gradle依赖:
dependencies{
compile 'org.apache.lucene:lucene-core:6.0.0'
compile 'org.apache.lucene:lucene-analyzers-common:6.0.0'
compile 'org.apache.lucene:lucene-demo:6.0.0'
}
示例工程:https://code.csdn.net/chuchus/lucenedemo/
1.关系型数据库的对比
2.索引
即倒排索引。简化版的索引可看作 <term,docIDList>这样一个map。
每个索引由若干个段(segment)组成。段的特性是写一次,读多次。段一旦建立便不可更改,直到下次合并。
2.1 文档的更新与删除
段不可更改,这样的设计简化了一些东西,但同时也引入了额外的工作,比如说删除。
被删除的文档信息存储在一个单独的文件中,但该段自身不被更新。那么底层的搜索就是这样的:第一次的搜索结果含有被删的文档,然后再读删除信息,把这个文档从返回结果中过滤掉。
对于更新操作也类似,底层实现是先删除再添加。
2.2 文档的添加
2.3 段合并
多个段在必要的时候会被lucene合并(merging)为一个大段。在合并时,不再需要的信息将被删除(例如被删除的文档)。
段合并的IO开销很大,所以需要控制合并操作的时机与频率。段的合并策略由MergePolicy类负责。
3.域处理
lucene可以对域进行三种操作。
- 域值可以被索引或不被索引。如果需要搜索一个域,必须对它进行索引。被索引的域值必须是文本格式的,二进制格式的域值只能被存储而不能被索引。
- 域被索引后,还可以选择性的存储项向量。
- 域值可以被单独存储。
3.1多值域
向同一个域写多个值是合理的。如一本书有多个作者。此时的代码见下:
for(String author:authors)
doc.add(new StringField("author",author,Field.Store.YES));
4.package概览
Lucene 软件包的发布形式是一个 JAR 文件,下面我们分析一下这个 JAR 文件里面的主要的 JAVA 包,使读者对之有个初步的了解。
Package: org.apache.lucene.store
数据存储管理包,主要包括一些底层的IO操作。
Package: org.apache.lucene.codecs
编码管理包,用于方便地自定义索引的编码和结构。
Package: org.apache.lucene.queryParser
查询分析包,实现查询语法,支持关键词之间的运算,如 '或' '且' '非'。
Package: org.apache.lucene.util
lucene公用的算法类
Package: org.apache.lucene.document
文档结构包,用于描述/索引存储时/的文档结构,类似于关系型数据库中/表/的结构。含有 Document, Field类。这样,每一个文档最终被封装成了一个 Document 对象。
Package: org.apache.lucene.analysis
语言分析包。这个包主要功能是对文档进行分词,因为文档在建立索引之前必须要进行分词,所以这个包的作用可以看成是为建立索引做准备工作。
Package: org.apache.lucene.index
索引管理包。这个包提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类:IndexWriter 和 IndexReader,其中 IndexWriter 是用来创建索引并添加文档到索引中的,IndexReader 是用来删除索引中的文档的。
Package: org.apache.lucene.search
检索管理包。这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法,Hits 用来保存搜索得到的结果。