原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/keyword.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/keyword.html

keyword(关键词)数据类型

一种索引结构化内容的字段,如 ID、电子邮件地址、主机名、状态码、邮政编码或标签。

它们通常用于过滤(比如,查找 status(状态) 为published的所有博客帖子)、排序和聚合。 keyword 字段只能通过它们的确切值进行搜索。

如果你需要索引全文内容,如电子邮件正文或产品描述,你可能更愿意使用text字段。

下面是一个是 keyword 字段的映射示例:

PUT my_index
{
  "mappings": {
    "properties": {
      "tags": {
        "type":  "keyword"
      }
    }
  }
}

映射数值型标识

并非所有数值数据都应映射为数值型字段数据类型。 Elasticsearch 为范围(range)查询优化数值型字段,如integerlong。 但是,keyword字段更适合于term和其他词级查询。

标识(identifier),如 ISBN 或产品ID,很少在范围(range)查询中使用。 但是,通常使用词级查询来检索它们。

在以下情况下,考虑将数值型标识映射为keyword

  • 你不打算使用range查询来搜索标识数据。
  • 快速检索很重要。 keyword字段上的term查询搜索通常比数值型字段上的term搜索更快。

如果你不确定应该使用哪一种,可以使用多字段(multi-field)将数据映射为keyword数值型数据类型。

keyword字段的参数

keyword字段接受以下参数:

boost

映射字段级查询时提升。接受浮点数,默认值为1.0

doc_values

是否应该以列跨度(column-stride)的方式将字段存储在磁盘上,以便以后用于排序、聚合或编写脚本? 接受true(默认) 或false

eager_global_ordinals

refresh 时应该急切地加载全局序号吗? 接受truefalse(默认)。 对于常用于词项聚合的字段,启用此功能是个好主意。

fields

多字段(multi-fields)允许出于不同目的以多种方式索引相同的字符串值,例如一个字段用于搜索,一个多字段用于排序和聚合。

ignore_above

不要索引任何长度超过此值的字符串。 默认值为2147483647,以便接受所有值。 但是请注意,默认的动态映射规则会创建一个子keyword字段,通过设置ignore_above: 256来覆盖此默认设置。

index

该字段应该是可搜索的吗?接受true (默认) 和 false

index_options

出于评分目的,什么信息应该存储在索引中。 默认为docs,但也可以设置为freqs,以便在计算分数时考虑词项的频率。

norms

在需要计算分数的查询时是否应考虑字段长度。 接受truefalse (默认)。

null_value

接受替换任何显式null值的字符串值。 默认值为null,这意味着该字段被视为缺失。

store

字段值是否应该与_source字段分开存储和检索。 接受truefalse (默认)。

similarity

应该使用哪种评分或相似度算法。 默认为BM25

normalizer

如何在编制索引前预处理 keyword? 默认为null,表示保持 keyword 不变。

split_queries_on_whitespace

为该字段构建查询时,全文查询是否应该使用"空白"拆分输入。 接受truefalse (默认)。

meta

字段的元数据。

从 2.x 版本导入的索引不支持keyword类型的字段。 相反,他们会尝试将keyword降级为string。 这允许你将现代映射与已过时但仍然被广泛使用的映射合并。 在升级到6.x版本之前,必须重新创建将被长期使用的索引,但是映射降级让你有机会按照自己的计划重新创建索引。