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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)