如果你有一个这样的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中索引对象包含数组子节点时, 查询和聚合的统计需要注意的问题。相关推荐

  1. JavaScript求数组中每个元素的个数,如数组str = [1,2,3,2,4,1,2]中元素2的个数为2。要求:使用对象知识来实现,输出结果为对象,对象包含数组元素和个数值。

    求数组中每个元素的个数,如数组str = [1,2,3,2,4,1,2]中元素2的个数为2. 要求:使用对象知识来实现,输出结果为对象,对象包含数组元素和个数值. <script>var ...

  2. 【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?

    写在前面 从开始学习Java的时候,我们就接触了这样一种观点:Java中的对象是在堆上创建的,对象的引用是放在栈里的,那这个观点就真的是正确的吗?如果是正确的,那么,面试官为啥会问:"Jav ...

  3. 微信小程序更新二维数组中的对象或数组的属性值

    微信小程序更新二维数组中的对象或数组的属性值,这里可能有两种情况 1.微信小程序更新二维数组中的对象的属性值 更新二维数组中的某个对象的属性值,代码如下 js 代码 data: {familys:[{ ...

  4. php怎么创建对象数组对象数组对象,在PHP中把对象当数组使用

    在PHP中把对象当数组使用 我们了解,JAVASCRIPT中,对象的属性.方法,是可以用数组的模式来访问的.但通常情况下是不可能的. 为什么要这么做?这是因为,通过这一方式,可以更加方便地操作对象,我 ...

  5. jquery中当点击子节点时如何实现删除父节点的问题

    父节点的 class="a" ,子节点的 class="b" ,当点击子节点时删除父节点, 在function remove(){}里怎么实现 可以这样做: $ ...

  6. vue中检测对象和数组值变化的问题

    今天工作中遇到改变vue  data中某个对象的值,却无法触发视图更新的问题.看了看官方文档,怎么解决的呢? 1.检测对象的变化 受现代 JavaScript 的限制(以及废弃 Object.obse ...

  7. vue中插值语法中v-for() of 与v-for() in 遍历对象数组的异同,以及for in for of在方法中遍历对象和数组的异同

    写这个的目的是记录下Vue中使用v-for-in v-for-of遍历对象与遍历数组的区别,以及JS中使用for-in for-of 遍历对象和数组的区别. 直接说结论,节约大家时间,下面是推论,有时 ...

  8. 定义对象或数组直接量时不同引擎对多余逗号的处理

    为什么80%的码农都做不了架构师?>>>    这种错误已经我已经多次犯了,一次用Ext做abcc的demo,一次是abcc查询模块. js报错分为两种:语法错误和运行错误 1.js ...

  9. php7 对象转数组,php7中为对象/关联数组进行解构赋值

    在CoffeeScript,Clojure,ES6和许多其他语言中,我们对对象/贴图/等进行了解构,如下所示: obj = {keyA: 'Hello from A', keyB: 'Hello fr ...

  10. php simplexmlelement array,php中SimpleXMLElement 对象转换为数组

    PHP 提供了 simplexml_load_string 方法用来解析 XML 格式的字符串,并返回 SimpleXMLElement 对象,不过一般数组是更为适用的,所以也会有转换为普通数组的需求 ...

最新文章

  1. MYSQL修改配置,允许远程访问
  2. 实战经验:MySQL 构建高并发网站性能优化
  3. GC悲观策略之Parallel GC篇
  4. 滑坡泥石流的防御措施_滑坡泥石流防御
  5. 用shell或者python写出各种图形
  6. 互联网大事件:《江南style》如何蹿红?(转)
  7. springboot 优雅停机_SpringBoot 优雅停止服务的几种方法 第309篇
  8. 安卓应用安全指南 翻译完成
  9. solrcloud配置中文分词器ik
  10. 如何用ZBrush快速绘制身体
  11. 爬虫之Beautiful Soup库入门
  12. [原]SyntaxError: invalid syntax 小问题
  13. javascript(JS)混淆工具
  14. cmd命令 查询硬盘序列号,设备序列号,MAC地址,操作系统及安装时间,以及与AIDA64软件的对比
  15. C++复习(二)——绘制余弦函数图像
  16. 基于ricequant线性回归量化交易
  17. golang 根据生日计算星座和属相
  18. Kali Linux安装dvwa本地shentou测试环境
  19. 快速学习COSMIC软件规模度量方法
  20. XCOPY与COPY

热门文章

  1. 中文拼写纠错_一种中文拼写检查方法与流程
  2. 五年50起并购、股价持续上扬,复盘IBM的物联网进化之路
  3. python except exception_Python 获取异常(Exception)信息的几种方法
  4. 网店系统SHOP++、V5shop、shopex全程分析
  5. Zynga公布2020年第四季度及全年财务业绩
  6. ElementPlus 侧边栏右侧空隙
  7. 免费FTP解决方案之FileZilla
  8. C语言中getch()、getche()、getc()、getchar()、gets()、fgetc()、fgets()的区别与使用
  9. SaaS、PaaS、IaaS是什么意思
  10. 1934. 贝茜放慢脚步