字段的 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