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

问题描述

我正在使用Elasticsearch 6.8版。我想存储一个标识符(一个包含字母,数字和可能的空格的字符串)。我将在该字段上使用的唯一过滤器将是exists过滤器(我将检查该值是否已设置)。使用keyword类型或text类型的最佳选择是什么?对于text类型,我可以设置

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

减小索引大小。

文档指出,由于这是“结构化”文本,所以最好的选择是使用keyword类型,但是由于可能的值数量很大(它是一个ID),因此担心这会占用大量磁盘空间。

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

解决方法

由于您不想搜索此字段的值或对其进行汇总,因此应在禁用keyword的情况下将此字段存储为doc_values

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

禁用doc_values将节省磁盘空间。

映射为text的字段没有启用doc_values,可以使用更少的空间,但是会对其进行分析并占用内存空间。

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