如果你有一个这样的json对象在es中,
"Item": {
"Key": [
{
"Name": "DetectorTempL",
"LowerThreshold": "",
"UpperThreshold": "",
"Unit": "℃",
"Value": "34.99854",
"Description": null
},
{
"Name": "DetectorTempM",
"LowerThreshold": "",
"UpperThreshold": "",
"Unit": "℃",
"Value": "35.24999",
"Description": null
},
{
"Name": "DetectorTempR",
"LowerThreshold": "",
"UpperThreshold": "",
"Unit": "℃",
"Value": "35.28124",
"Description": null
},
{
"Name": "RackENVTemp",
"LowerThreshold": "",
"UpperThreshold": "",
"Unit": "℃",
"Value": "24.5",
"Description": null
}
]
}
然后你想用es来根据name统计value的平均值, 这个场景下你就必须要了解nested(嵌套), 不然你会发现你的所有Name的Value统计值都是相同的。
主要原因是es默认是扁平化处理,上面会变成下面这样的数据, 然后每条数据之间并没有关系, 也就是说Item.Key.Name和Item.Key.Value并没有关系了,这样我们统计某个name的value肯定就不正确了。
"Item.Key.Name": "DetectorTempL",
"Item.Key.Name": "DetectorTempR",
"Item.Key.Value": "34.99854",
"Item.Key.Value": "35.28124",
使用nested分为四个步骤:
1. 删除es中旧的数据,因为这些数据建立的默认mapping已经存在了。 具体使用
DELETE 索引名字
2.设置某个索引的映射(mapping), (解释下:metric_ctdms是我的索引名字, ctdms是es中_type的名字, 这个类型下面包含了Item属性, Item属性包含了Key属性, Key属性是个数组。)
我们只需要把某个类型的某个数组字段添加"type": "nested"即可。
PUT metric_ctdms
{
"mappings": {
"ctdms": {
"properties": {
"Item": {
"properties": {
"Key": {
"type": "nested",
"properties": {
"Value": {
"type": "float"
}
}
}
}
}
}
}
}
}
3.重新索引对象, 然后用_mapping查看我们映射的设置结果
GET /metric_ctdms/_mapping/ctdms
4.修改我们的query和aggs为nested类型去查询和分组聚合。
请求:
POST /ctdms/_search?typed_keys=true&filter_path=*.*.buckets
{
"query": {
"bool": {
"must": [
{
"match": {
"SystemID": {
"query": "101092010010"
}
}
},
{
"range": {
"OperationDateTime": {
"gte": "20161028",
"lte": "20161030",
"format": "yyyyMMdd"
}
}
}
]
}
},
"aggs": {
"by_day": {
"date_histogram": {
"field": "OperationDateTime",
"interval": "day",
"format": "yyyy-MM-dd"
},
"aggs": {
"Item.Key": {
"nested": {
"path": "Item.Key"
},
"aggs": {
"terms": {
"terms": {
"field": "Item.Key.Name.keyword",
"size": 10
},
"aggs": {
"avg": {
"avg": {
"field": "Item.Key.Value"
}
}
}
}
}
}
}
}
}
}
返回结果:
{
"aggregations": {
"date_histogram#by_day": {
"buckets": [
{
"key_as_string": "2016-10-28",
"key": 1477612800000,
"doc_count": 19,
"nested#Item.Key": {
"doc_count": 76,
"sterms#terms": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "DetectorTempL",
"doc_count": 19,
"avg#avg": {
"value": 34.906860753109584
}
},
{
"key": "DetectorTempM",
"doc_count": 19,
"avg#avg": {
"value": 35.17318605121813
}
},
{
"key": "DetectorTempR",
"doc_count": 19,
"avg#avg": {
"value": 35.05932958502518
}
},
{
"key": "RackENVTemp",
"doc_count": 19,
"avg#avg": {
"value": 24.34830103422466
}
}
]
}
}
}
]
}
}
}
restful参考:
https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/nested-aggregation.html
https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-mapping.html
https://www.elastic.co/guide/en/elasticsearch/reference/2.4/nested.html
https://blog.csdn.net/u012332735/article/details/62222953
https://blog.csdn.net/lom9357bye/article/details/79058875
https://www.cnblogs.com/sheeva/p/4837881.html
https://blog.csdn.net/shiyaru1314/article/details/71479807
api参考:
https://github.com/elastic/elasticsearch-net/blob/18322313b62c98f48a92d3efa1ae58c78f838f2a/docs/client-concepts/high-level/mapping/fluent-mapping.asciidoc
https://github.com/elastic/elasticsearch-net/blob/3cee5eb624478649058150e60ef57bc4d08e7e7e/src/Nest/_Generated/_LowLevelDispatch.generated.cs
https://github.com/rossbrower/elasticsearch-client/blob/70a57bff371c5b5555ffe7e4244a197a2b52e188/src/ElasticsearchClient/Generated/IndicesPutMapping.cs
https://github.com/elastic/elasticsearch-net/blob/3cee5eb624478649058150e60ef57bc4d08e7e7e/src/Tests/Indices/MappingManagement/PutMapping/PutMappingApiTest.cs
https://github.com/cp2boston/es-rni-nest/blob/63d68c276c72fff66490535c8d4313d975e6f45c/estest/Program.cs
https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/nested-aggregation-usage.html
https://stackoverflow.com/questions/36330471/elasticsearch-nest-2-how-to-correctly-map-and-use-nested-classes-and-bulk-index
es中索引对象包含数组子节点时, 查询和聚合的统计需要注意的问题。相关推荐
- JavaScript求数组中每个元素的个数,如数组str = [1,2,3,2,4,1,2]中元素2的个数为2。要求:使用对象知识来实现,输出结果为对象,对象包含数组元素和个数值。
求数组中每个元素的个数,如数组str = [1,2,3,2,4,1,2]中元素2的个数为2. 要求:使用对象知识来实现,输出结果为对象,对象包含数组元素和个数值. <script>var ...
- 【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?
写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...
- 微信小程序更新二维数组中的对象或数组的属性值
微信小程序更新二维数组中的对象或数组的属性值,这里可能有两种情况 1.微信小程序更新二维数组中的对象的属性值 更新二维数组中的某个对象的属性值,代码如下 js 代码 data: {familys:[{ ...
- php怎么创建对象数组对象数组对象,在PHP中把对象当数组使用
在PHP中把对象当数组使用 我们了解,JAVASCRIPT中,对象的属性.方法,是可以用数组的模式来访问的.但通常情况下是不可能的. 为什么要这么做?这是因为,通过这一方式,可以更加方便地操作对象,我 ...
- jquery中当点击子节点时如何实现删除父节点的问题
父节点的 class="a" ,子节点的 class="b" ,当点击子节点时删除父节点, 在function remove(){}里怎么实现 可以这样做: $ ...
- vue中检测对象和数组值变化的问题
今天工作中遇到改变vue data中某个对象的值,却无法触发视图更新的问题.看了看官方文档,怎么解决的呢? 1.检测对象的变化 受现代 JavaScript 的限制(以及废弃 Object.obse ...
- vue中插值语法中v-for() of 与v-for() in 遍历对象数组的异同,以及for in for of在方法中遍历对象和数组的异同
写这个的目的是记录下Vue中使用v-for-in v-for-of遍历对象与遍历数组的区别,以及JS中使用for-in for-of 遍历对象和数组的区别. 直接说结论,节约大家时间,下面是推论,有时 ...
- 定义对象或数组直接量时不同引擎对多余逗号的处理
为什么80%的码农都做不了架构师?>>> 这种错误已经我已经多次犯了,一次用Ext做abcc的demo,一次是abcc查询模块. js报错分为两种:语法错误和运行错误 1.js ...
- php7 对象转数组,php7中为对象/关联数组进行解构赋值
在CoffeeScript,Clojure,ES6和许多其他语言中,我们对对象/贴图/等进行了解构,如下所示: obj = {keyA: 'Hello from A', keyB: 'Hello fr ...
- php simplexmlelement array,php中SimpleXMLElement 对象转换为数组
PHP 提供了 simplexml_load_string 方法用来解析 XML 格式的字符串,并返回 SimpleXMLElement 对象,不过一般数组是更为适用的,所以也会有转换为普通数组的需求 ...
最新文章
- MYSQL修改配置,允许远程访问
- 实战经验:MySQL 构建高并发网站性能优化
- GC悲观策略之Parallel GC篇
- 滑坡泥石流的防御措施_滑坡泥石流防御
- 用shell或者python写出各种图形
- 互联网大事件:《江南style》如何蹿红?(转)
- springboot 优雅停机_SpringBoot 优雅停止服务的几种方法 第309篇
- 安卓应用安全指南 翻译完成
- solrcloud配置中文分词器ik
- 如何用ZBrush快速绘制身体
- 爬虫之Beautiful Soup库入门
- [原]SyntaxError: invalid syntax 小问题
- javascript(JS)混淆工具
- cmd命令 查询硬盘序列号,设备序列号,MAC地址,操作系统及安装时间,以及与AIDA64软件的对比
- C++复习(二)——绘制余弦函数图像
- 基于ricequant线性回归量化交易
- golang 根据生日计算星座和属相
- Kali Linux安装dvwa本地shentou测试环境
- 快速学习COSMIC软件规模度量方法
- XCOPY与COPY
热门文章
- 中文拼写纠错_一种中文拼写检查方法与流程
- 五年50起并购、股价持续上扬,复盘IBM的物联网进化之路
- python except exception_Python 获取异常(Exception)信息的几种方法
- 网店系统SHOP++、V5shop、shopex全程分析
- Zynga公布2020年第四季度及全年财务业绩
- ElementPlus 侧边栏右侧空隙
- 免费FTP解决方案之FileZilla
- C语言中getch()、getche()、getc()、getchar()、gets()、fgetc()、fgets()的区别与使用
- SaaS、PaaS、IaaS是什么意思
- 1934. 贝茜放慢脚步