doc_values
默认情况下,大多数字段都会被索引,从而使其可被搜索。倒排索引允许查询在唯一的有序词项列表中查找搜索词,并从中立即访问包含该词项的文档列表。
排序、聚合以及在脚本中访问字段值需要不同的数据访问模式。我们不是查找词项并找到文档,而是需要能够查找文档并找到该文档在某个字段中拥有的词项。
doc_values
字段是在文档索引时构建的一种磁盘上的数据结构,可实现高效的数据访问。它存储的值与 _source
相同,但采用列式格式,对排序和聚合更高效。
大多数字段类型都支持 doc value,但不包括 text
和 annotated_text
字段。另请参阅禁用 doc value。
数字类型、日期类型、布尔类型、IP 类型、geo_point 类型 和 keyword 类型 在未被索引但仅启用 doc value 时也可进行查询。在 doc value 上的查询性能比在索引结构上的查询性能慢得多,但这为那些很少查询且查询性能不那么重要的字段提供了在磁盘使用和查询性能之间的一个有趣的权衡。这使得仅包含 doc value 的字段非常适合那些通常不用于过滤的字段,例如指标数据中的计量器或计数器。
仅包含 doc value 的字段可以配置如下
PUT my-index-000001
{
"mappings": {
"properties": {
"status_code": {
"type": "long"
},
"session_id": {
"type": "long",
"index": false
}
}
}
}
status_code
字段是一个普通的 long 字段。session_id
字段禁用了index
,因此它是一个仅包含 doc value 的 long 字段,因为默认情况下 doc value 是启用的。
对于所有支持 doc value 的字段,doc_values
默认是启用的。如果您确定不需要对某个字段进行排序或聚合,或者不需要从脚本中访问其值,则可以禁用 doc_values
以节省磁盘空间。
您无法禁用 wildcard
字段的 doc value。
在某些字段类型(例如 search_as_you_type
)中,doc value 会出现在 API 响应中,但无法配置。为此类字段启用或禁用 doc_values
可能会导致错误或没有任何效果。
在以下示例中,在一个字段上禁用了 doc_values
PUT my-index-000001
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword"
},
"session_id": {
"type": "keyword",
"doc_values": false
}
}
}
}
status_code
字段默认启用了doc_values
。session_id
禁用了doc_values
,但仍可被查询。