doc_values

编辑

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

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

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

仅 doc value 字段

编辑

数值类型日期类型布尔类型ip 类型geo_point 类型keyword 类型 在未索引,但仅启用 doc values 的情况下也可以被查询。在 doc values 上的查询性能比在索引结构上的查询性能慢得多,但对于很少查询且查询性能不那么重要的字段来说,这在磁盘使用和查询性能之间提供了一个有趣的权衡。这使得仅 doc value 字段非常适合那些不希望通常用于过滤的字段,例如指标数据上的仪表或计数器。

仅 doc value 字段可以如下配置:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "status_code": {
                "type": "long"
            },
            "session_id": {
                "type": "long",
                "index": False
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        status_code: {
          type: 'long'
        },
        session_id: {
          type: 'long',
          index: false
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      status_code: {
        type: "long",
      },
      session_id: {
        type: "long",
        index: false,
      },
    },
  },
});
console.log(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 以节省磁盘空间。

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "status_code": {
                "type": "keyword"
            },
            "session_id": {
                "type": "keyword",
                "doc_values": False
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        status_code: {
          type: 'keyword'
        },
        session_id: {
          type: 'keyword',
          doc_values: false
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      status_code: {
        type: "keyword",
      },
      session_id: {
        type: "keyword",
        doc_values: false,
      },
    },
  },
});
console.log(response);
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,但仍然可以被查询。

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