doc_values编辑

默认情况下,大多数字段都被索引,这使得它们可搜索。倒排索引允许查询在唯一的排序词语列表中查找搜索词,并立即访问包含该词语的文档列表。

排序、聚合和脚本中的字段值访问需要不同的数据访问模式。我们不需要查找词语并找到文档,而是需要能够查找文档并找到它在字段中包含的词语。

Doc values 是在文档索引时构建的磁盘上数据结构,它使得这种数据访问模式成为可能。它们存储与_source相同的值,但以列式方式存储,这对于排序和聚合来说效率更高。Doc values 在几乎所有字段类型上都受支持,textannotated_text 字段是显著的例外

仅 doc-value 的字段编辑

数值类型日期类型布尔类型ip 类型geo_point 类型关键字类型 也可以在它们没有被索引 但仅启用了 doc values 时进行查询。Doc values 上的查询性能比索引结构上的查询性能慢得多,但对于很少查询的字段(查询性能不那么重要)来说,它在磁盘使用量和查询性能之间提供了有趣的权衡。这使得仅 doc-value 的字段非常适合那些预计不会用于过滤的字段,例如度量数据上的仪表或计数器。

仅 doc-value 的字段可以按如下方式配置

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        status_code: {
          type: 'long'
        },
        session_id: {
          type: 'long',
          index: false
        }
      }
    }
  }
)
puts response
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 values 默认情况下是启用的。

禁用 doc values编辑

所有支持 doc values 的字段默认情况下都启用了它们。如果您确定不需要对某个字段进行排序或聚合,或者从脚本访问字段值,您可以禁用 doc values 以节省磁盘空间

response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        status_code: {
          type: 'keyword'
        },
        session_id: {
          type: 'keyword',
          doc_values: false
        }
      }
    }
  }
)
puts response
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "status_code": { 
        "type":       "keyword"
      },
      "session_id": { 
        "type":       "keyword",
        "doc_values": false
      }
    }
  }
}

status_code 字段默认情况下启用了 doc_values

session_iddoc_values 被禁用,但仍然可以查询。

您不能为wildcard 字段禁用 doc values。