Elasticsearch 7 : doc_values 属性
字段的 doc_values 属性有两个值, true、false。默认为 true ,即开启。
当 doc_values 为 fasle 时,无法基于该字段排序、聚合、在脚本中访问字段值。
当 doc_values 为 true 时,ES 会增加一个相应的正排索引,这增加的磁盘占用,也会导致索引数据速度慢一些。
示例1: 关闭 doc_values 属性
创建索引
PUT student { "mappings" : { "properties" : { "name" : { "type" : "keyword", "doc_values": false }, "age" : { "type" : "integer", "doc_values": false } } } }
插入数据
POST _bulk { "index" : { "_index" : "student", "_id" : "1" } } { "name" : "张三", "age": 12 } { "index" : { "_index" : "student", "_id" : "2" } } { "name" : "李四", "age": 10 } { "index" : { "_index" : "student", "_id" : "3" } } { "name" : "王五", "age": 11 }
查询数据
POST student/_search { "query": { "match_all": {} } }
执行结果:
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "student", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "name" : "张三", "age" : 12 } }, { "_index" : "student", "_type" : "_doc", "_id" : "2", "_score" : 1.0, "_source" : { "name" : "李四", "age" : 10 } }, { "_index" : "student", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "name" : "王五", "age" : 11 } } ] } }
查询数据并按照age排序,会报错
POST student/_search { "query": { "match_all": {} }, "sort" : [ {"age": {"order": "desc"}} ], "from": 0, "size": 1 }
报错如下:
{ "error": { "root_cause": [ { "type": "illegal_argument_exception", "reason": "Can't load fielddata on [age] because fielddata is unsupported on fields of type [integer]. Use doc values instead." } ], "type": "search_phase_execution_exception", "reason": "all shards failed", "phase": "query", "grouped": true, "failed_shards": [ { "shard": 0, "index": "student", "node": "wFhSfuLwR3OX21eldbRIHg", "reason": { "type": "illegal_argument_exception", "reason": "Can't load fielddata on [age] because fielddata is unsupported on fields of type [integer]. Use doc values instead." } } ], "caused_by": { "type": "illegal_argument_exception", "reason": "Can't load fielddata on [age] because fielddata is unsupported on fields of type [integer]. Use doc values instead.", "caused_by": { "type": "illegal_argument_exception", "reason": "Can't load fielddata on [age] because fielddata is unsupported on fields of type [integer]. Use doc values instead." } } }, "status": 400 }
查询数据并按照 name 排序,会报错
和基于 age 的排序报错类似。
获取 age 平均值,会报错
POST student/_search { "aggs":{ "age_stat": { "avg": {"field": "age"} } }, "from": 0 }
和上面的排序报错类似。
示例2: 开启 doc_values 属性
创建索引
PUT student { "mappings" : { "properties" : { "name" : { "type" : "keyword", "doc_values": true }, "age" : { "type" : "integer", "doc_values": true } } } }
插入数据
POST _bulk { "index" : { "_index" : "student", "_id" : "1" } } { "name" : "张三", "age": 12 } { "index" : { "_index" : "student", "_id" : "2" } } { "name" : "李四", "age": 10 } { "index" : { "_index" : "student", "_id" : "3" } } { "name" : "王五", "age": 11 }
查询数据
POST student/_search { "query": { "match_all": {} } }
执行结果:
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "student", "_type" : "_doc", "_id" : "1", "_score" : 1.0, "_source" : { "name" : "张三", "age" : 12 } }, { "_index" : "student", "_type" : "_doc", "_id" : "2", "_score" : 1.0, "_source" : { "name" : "李四", "age" : 10 } }, { "_index" : "student", "_type" : "_doc", "_id" : "3", "_score" : 1.0, "_source" : { "name" : "王五", "age" : 11 } } ] } }
查询数据并按照age排序,正常执行
POST student/_search { "query": { "match_all": {} }, "sort" : [ {"age": {"order": "desc"}} ], "from": 0, "size": 1 }
响应:
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : null, "hits" : [ { "_index" : "student", "_type" : "_doc", "_id" : "1", "_score" : null, "_source" : { "name" : "张三", "age" : 12 }, "sort" : [ 12 ] } ] } }
查询数据并按照 name 排序,正常执行
POST student/_search { "query": { "match_all": {} }, "sort" : [ {"name": {"order": "desc"}} ], "from": 0, "size": 1 }
响应:
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : null, "hits" : [ { "_index" : "student", "_type" : "_doc", "_id" : "3", "_score" : null, "_source" : { "name" : "王五", "age" : 11 }, "sort" : [ "王五" ] } ] } }
获取 age 平均值,正常执行
POST student/_search { "aggs":{ "age_stat": { "avg": {"field": "age"} } }, "from": 0, "size": 0 }
响应:
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 3, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "aggregations" : { "age_stat" : { "value" : 11.0 } } }
原文链接:https://www.letianbiji.com/elasticsearch/es7-doc-values.html