全文检索 (Full Text Retrieval) 是指以全部文本信息作为检索对象的一种信息检索技术。
lucene 能做到在秒级对大量数据进行查询,依赖的就是被称之为索引的结构。 Lucene 存放数据的地方我们通常称之为索引库,索引库又分为两部分组成:原始记录和词汇表.
org.apache.lucene.analysis
主要负责词法分析及语言处理。org.apache.lucene.codecs
主要负责文本内容到倒排索引的编码和解码。org.apache.lucene.document
提供了对用户内容的抽象 Document, 及 Fields.org.apache.lucene.index
主要负责对索引的读写。org.apache.lucene.search
主要负责搜索过程。org.apache.lucene.store
主要负责索引的持久化等内容。org.apache.lucene.util
工具包。
创建索引库的步骤
- 创建 IndexWriter 对象
- 创建 Document 对象,通过 IndexWriter 写入索引库
- 关闭 IndexWriter 对象
Directory dir = FSDirectory.open(Paths.get("path"));
IndexWriter indexWriter = new IndexWriter(dir, iwc);
根据关键字查询索引库中的内容
- 创建 QueryParser 对象
- 创建 Query 对象来封装关键字
- 创建 IndexSearcher 对象
- 用 IndexSearcher 对象去索引库中查询符合条件的前 100 条记录,不足 100 条记录的以实际为准
- 获取符合条件的编号
- 用 indexSearcher 对象去索引库中查询编号对应的 Document 对象
- 将 Document 对象中的所有属性取出,再封装回 JavaBean 对象中去,并加入到集合中保存,以备将之用
Lucene 近实时搜索
近实时,Near Real Time, 简称 NRT.
修改先保存到内存
数据库事务 ACID 特性
- 原子性 (atomicity,或称不可分割性)
- 一致性 (consistency)
- 隔离性 (isolation,又称独立性)
- 持久性 (durability)
如何实现 Lucene 近实时搜索
搜索端持有 IndexWriter
在搜索端持有 IndexWriter 的情况下,利用 IndexWriter 打开 reader,可以确保 reader 能够读取到最新的数据,包括尚未提交的数据。Lucene 在同一时刻只允许存在一个写端,但可以有多个读端同时存在。
搜索端不持有 IndexWriter
在使用 Lucene 时,通过 IndexReader 打开索引相当于对当前索引进行了一次快照 (Snapshot)。即使写端执行了 commit 操作,如果 IndexReader 不重新打开,新提交的内容对搜索端仍然是不可见的。要实现 Lucene 的近实时搜索,关键在于两个方面:一是写端定期进行 commit 操作,二是搜索端定期进行 reopen 操作。
Field& Query
整形 ID 过滤