Lucene 笔记

全文检索 (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 工具包。

创建索引库的步骤

  1. 创建 IndexWriter 对象
  2. 创建 Document 对象,通过 IndexWriter 写入索引库
  3. 关闭 IndexWriter 对象
Directory dir = FSDirectory.open(Paths.get("path"));
IndexWriter indexWriter = new IndexWriter(dir, iwc);

根据关键字查询索引库中的内容

  1. 创建 QueryParser 对象
  2. 创建 Query 对象来封装关键字
  3. 创建 IndexSearcher 对象
  4. 用 IndexSearcher 对象去索引库中查询符合条件的前 100 条记录,不足 100 条记录的以实际为准
  5. 获取符合条件的编号
  6. 用 indexSearcher 对象去索引库中查询编号对应的 Document 对象
  7. 将 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 过滤

ElasticSearch 笔记

参考资料