0%

Lucene简介

Lucene 简介:开源搜索引擎的核心引擎

Lucene 是 Apache 基金会旗下的一款高性能、可伸缩的开源信息检索库,它提供了完整的索引构建、检索和排序功能,是 Elasticsearch、Solr 等主流搜索引擎的底层核心。本文将详细解析 Lucene 的核心概念、索引机制及工作流程。

Lucene 核心概念

Lucene 围绕 “索引” 和 “检索” 构建了一套完整的抽象模型,以下是关键概念:

索引库(Index)

  • 定义:Lucene 中,一个目录即一个索引库,目录下的所有文件共同构成一个完整的索引,包含多个文档(Document)。
  • 特点:索引库是 Lucene 操作的基本单位,所有文档的索引数据(如倒排索引、词项信息)都存储在该目录中。
  • 类比:类似数据库中的 “数据库实例”,一个索引库可对应一个业务场景(如 “商品索引”“文章索引”)。

段(Segment)

段是 Lucene 索引的 “子单元”,一个索引库由多个段组成,每个段是一个独立的、不可修改的索引片段。

核心特性:
  • 不可变性:段一旦写入磁盘,就只能读取,不能修改(保证索引稳定性和查询性能)。
  • 增删改处理:
    • 新增:新文档会生成新段(先写入内存,批量刷盘以减少 IO)。
    • 删除:不直接删除段中数据,而是通过 .del 文件标记被删除的文档 ID,查询时过滤这些文档(段合并时才真正移除)。
    • 修改:等价于 “删除旧文档 + 新增新文档”(旧文档被标记删除,新文档写入新段)。
  • 段合并:当段数量过多时,Lucene 会自动合并小段位大段(减少文件句柄占用,提升查询效率)。
延迟写机制:

新增数据先写入内存缓冲区,积累到一定量后批量刷盘生成新段,同时生成提交点(记录已刷盘的段信息)。这一机制减少了磁盘 IO 次数,提升性能。

文档(Document)

  • 定义:文档是 Lucene 中索引和检索的基本单位,由多个域(Field) 组成,类似数据库中的 “一行记录”。
  • 示例:一篇文章的文档可能包含 title(标题)、content(内容)、publishTime(发布时间)等域。

域(Field)

域是文档的组成部分,包含 “域名称” 和 “域值”,并具有特定类型(决定是否索引、是否存储、是否分词等)。

常见域类型及用途:
域类型 特点 适用场景
TextField 会索引、分词(词条化),但不保存词向量 正文、描述等需要全文检索的文本
StringField 会索引,但不分词(整个值作为一个词项) 身份证号、手机号等精确匹配的字符串
IntPoint/LongPoint 等数值类型 仅索引数值,支持范围查询 年龄、价格、时间等数值字段
StoredField 仅存储值,不索引 需返回给用户但无需检索的字段(如图片 URL)
SortedDocValuesField 存储文本并构建有序映射(DocValues) 需按文本字段排序、聚合的场景
NumericDocValuesField 存储数值并构建有序映射(DocValues) 需按数值字段排序、聚合的场景
DocValues 机制:

是 Lucene 额外构建的 “文档 ID→域值” 的有序映射表,支持高效排序、聚合和分组(Elasticsearch 默认对非分词字符串外的字段启用)。

词项(Term)

  • 定义:词项是检索的基本单元,由 “域名称” 和 “关键词” 组成。同一词语在不同域中是不同的词项(如 title:lucenecontent:lucene 是两个词项)。
  • 生成:文档的域值经分词器处理后,拆分出的每个语义单元即为词项。

词条(Token)

  • 定义:词项在文本中的一次具体出现,包含词项文本、在原文本中的起止位置(偏移量)和词条类型。
  • 示例:“Lucene 是搜索引擎” 中,“Lucene” 作为一个词条,包含文本 “Lucene”、偏移量(0-6)等信息。

查询(Query)

  • 定义:用户检索需求的结构化表示,可由词项、逻辑关系(AND/OR)、范围等组成。
  • 常见类型:
    • TermQuery:单个词项查询(如 title:lucene)。
    • PhraseQuery:短语查询(如 “lucene 索引” 需相邻出现)。
    • RangeQuery:范围查询(如 price:[100 TO 200])。
    • BooleanQuery:多条件组合查询(如 title:lucene AND publishTime:[2023 TO *])。

分词器(Analyzer)

分词器负责将域值拆分为词项,是索引质量的关键。其核心由 Tokenizer(字符流转词条)和 TokenFilter(过滤 / 处理词条,如大小写转换、去停止词)组成。

常见分词器:
  • 英文分词器:
    • StandardAnalyzer(默认):按空格、符号分词,支持数字、邮箱等格式。
    • StopAnalyzer:过滤停止词(如 “the”“and”),并转为小写。
    • KeywordAnalyzer:不分词,将整个域值作为一个词项。
  • 中文分词器:
    • 一元分词:按单个字拆分(如 “上海”→“上”“海”,语义差)。
    • 二元分词:按相邻两字拆分(如 “上海”→“上海”,但可能产生无意义组合)。
    • 词库分词(如结巴分词):基于词库拆分(如 “上海”→“上海”,更准确,但需维护词库)。

索引构建过程

Lucene 索引构建是将文档转换为可检索结构的过程,步骤如下:

  1. 准备文档:创建 Document 对象,添加多个 Field(根据需求选择域类型)。
  2. 分词处理:通过 Analyzer 对文档的可索引域(如 TextField)进行分词,生成词项和词条。
  3. 构建倒排索引:为每个词项创建倒排列表(记录包含该词项的文档 ID、出现位置等)。
  4. 写入段:索引数据先写入内存缓冲区,积累到阈值后刷盘生成新段,并更新提交点。
  5. 段合并:当段数量过多时,自动合并小段位大段,优化查询性能。

索引搜索过程

搜索过程是根据查询条件从索引中快速定位相关文档的过程,步骤如下:

  1. 解析查询:将用户输入转换为 Query 对象(如 TermQuery)。
  2. 检索索引:通过 IndexSearcher 遍历索引库的段,根据查询条件匹配倒排列表,找到相关文档 ID。
  3. 计算相关性:对匹配的文档打分(如基于词频、位置等),按分数排序。
  4. 返回结果:获取 Top N 文档(TopDocs),通过 IndexReader 读取文档详情并返回

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10