0%

Lucene的Field域

Lucene 中 Field 域的核心属性解析

在 Lucene 中,Field(域)是文档(Document)的基本组成单元,每个 Field 的行为由其核心属性决定。这些属性包括是否分词(tokenized)是否索引(indexed)是否存储(stored),它们直接影响索引构建、查询效率和结果展示。以下是对这些属性的详细说明:

是否分词(tokenized)

分词(tokenized)指将 Field 的原始值拆分为多个词项(Term)的过程,目的是为后续的全文检索提供可匹配的单元。

是(tokenized = true)

  • 行为:Field 的值会被分词器(Analyzer)处理,拆分为多个词项(如 “Lucene 搜索引擎”→“Lucene”“搜索引擎”)。
  • 适用场景:需要进行全文检索的字段,其内容通常是长文本,且用户可能通过其中的任意关键词查询。
    • 示例:商品名称、文章正文、描述信息等。
    • 原因:这些字段需要支持 “包含某个关键词” 的模糊查询,分词后才能建立细粒度的倒排索引。

否(tokenized = false)

  • 行为:Field 的值不会被拆分,整个值作为一个完整的词项(Term)。
  • 适用场景:需要精确匹配的字段,其值通常是唯一标识或固定格式的字符串。
    • 示例:商品 ID(如 “P10086”)、订单号、身份证号、URL 等。
    • 原因:这些字段的查询通常是 “完全匹配”(如 “查询 ID 为 P10086 的商品”),无需分词。

是否索引(indexed)

索引(indexed)指将 Field 的值(分词后的词项或完整值)存入倒排索引,使其可被查询。只有索引的字段才能作为查询条件。

是(indexed = true)

  • 行为:Field 的值(分词后的词项或完整值)会被写入倒排索引,支持通过关键词查询。
  • 适用场景:所有需要作为查询条件的字段,无论是否分词。
    • 分词字段:如商品名称(分词后索引,支持 “包含关键词” 查询)。
    • 不分词字段:如订单号(完整值索引,支持 “精确匹配” 查询)。

否(indexed = false)

  • 行为:Field 的值不会被写入倒排索引,无法作为查询条件。
  • 适用场景:仅用于展示,无需作为查询条件的字段。
    • 示例:商品图片路径(/images/goods/1.jpg)、文件本地存储路径等。
    • 原因:这些字段用户不会用来查询,不索引可减少索引体积,提升性能。

是否存储(stored)

存储(stored)指将 Field 的原始值存入文档(Document),使其可在查询结果中被读取和展示。

是(stored = true)

  • 行为:Field 的原始值会被保存到文档中,查询时可通过Document.getFieldValue()获取。
  • 适用场景:需要在查询结果中展示的字段。
    • 示例:商品名称、价格、简介等(用户搜索后需看到这些信息)。

否(stored = false)

  • 行为:Field 的原始值不被保存,查询时无法从 Document 中获取。
  • 适用场景:
    • 内容过大的字段(如长文本正文):避免占用过多存储空间,可在查询到文档 ID 后从数据库中读取。
    • 仅用于检索但无需展示的字段(如某些内部标签)。

Field 属性组合示例

不同的属性组合对应不同的业务需求,以下是常见组合场景:

场景 是否分词 是否索引 是否存储 示例字段
全文检索 + 结果展示 商品名称、文章标题
全文检索 + 不展示 文章正文(从数据库读取)
精确查询 + 结果展示 订单号、用户名
仅展示 + 不检索 图片路径、备注
仅检索 + 不展示 内部标签、分类 ID

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