如果仅使用存在过滤器,则使用哪种 Elasticsearch 字符串数据类型?

Which Elasticsearch string datatype to use if only exists filter is used?

我使用的是 Elasticsearch 6.8 版。我想存储一个标识符(一个由字母、数字和可能的 whitespace 组合而成的字符串)。我将在该字段上使用的唯一过滤器是 exists 过滤器(我将检查该值是否已设置)。这里最好的选择是什么,使用 keyword 类型还是 text 类型?对于 text 类型我大概可以设置

  "norms": false,
  "index_options": "freqs"

减少索引大小。

文档指出,由于这是“结构化”文本,最好的选择是使用 keyword 类型,但由于可能值的数量很大(它是一个 ID),我恐怕这会占用大量磁盘 space.

我有一个包含数百万条记录的索引,因此我想保持该字段的磁盘使用率较低。哪个选项最适合磁盘 space,对性能有何影响?

由于您不想搜索此字段的值或它们的 运行 聚合,您应该将此字段存储为 keyword 并禁用 doc_values

"fieldName": { 
    "type":       "keyword",
    "doc_values": false
}

禁用 doc_values 将为您节省磁盘 space。

映射为 text 的字段未启用 doc_values 并且可以使用更少的 space,但它们已被分析并且可以在内存中占用 space。

如果您根本不关心字段的值,您甚至可以在摄取期间将其更改为简单的字符串或单个数字,具体取决于您摄取数据的方式。