当前位置: 首页 > 知识库问答 >
问题:

在ElasticSearch中仅聚合匹配的嵌套对象值

劳灵均
2023-03-14

我只需要对与查询匹配的嵌套对象上的值求和。看起来ElasticSearch确定与查询匹配的文档,然后对所有嵌套对象求和。从下面的大纲中,我想搜索嵌套对象。objtype=“A”并返回objvalue之和,仅用于匹配嵌套对象,我想得到值4。这可能吗?如果是,如何?

这是地图

{
  "myindex": {
    "mappings": {
      "mytype": {
        "properties": {
           "nestedobjects": {
             "type": "nested",
             "include_in_parent": true,
             "properties": {
               "objtype": {
                 "type": "string"
               },
               "objvalue": {
                 "type": "integer"
               }
             }
           }
         }
       }
     }
   }
 }

这是我的文件

PUT /myindex/mytype/1
{
  "nestedobjects": [
    { "objtype": "A", "objvalue": 1 },
    { "objtype": "B", "objvalue": 2 }
  ]
}
PUT /myindex/mytype/2
{
  "nestedobjects": [
    { "objtype": "A", "objvalue": 3 },
    { "objtype": "B", "objvalue": 3 }
  ]
}

这是我的查询代码。

POST allscriptshl7/_search?search_type=count
{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "nestedobjects.objtype:A"
        }
      }
    }
  },
  "aggregations": {
    "my_agg": {
      "sum": {
        "field": "nestedobjects.objvalue"
      }
    }
  }
}

共有1个答案

严狐若
2023-03-14

由于两个(外部)文档都符合其中一个内部文档与查询匹配的条件,因此将返回两个外部文档,并根据属于这些外部文档的所有内部文档计算聚合。呼。

无论如何,我认为,这似乎可以满足您的需要,使用过滤器聚合:

POST /myindex/_search?search_type=count
{
   "aggs": {
      "nested_nestedobjects": {
         "nested": {
            "path": "nestedobjects"
         },
         "aggs": {
            "filtered_nestedobjects": {
               "filter": {
                  "term": {
                     "nestedobjects.objtype": "a"
                  }
               },
               "aggs": {
                  "my_agg": {
                     "sum": {
                        "field": "nestedobjects.objvalue"
                     }
                  }
               }
            }
         }
      }
   }
}
...
{
   "took": 4,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "nested_nestedobjects": {
         "doc_count": 4,
         "filtered_nestedobjects": {
            "doc_count": 2,
            "my_agg": {
               "value": 4,
               "value_as_string": "4.0"
            }
         }
      }
   }
}

这是我用来测试它的一些代码:

http://sense.qbox.io/gist/c1494619ff1bd0394d61f3d5a16cb9dfc229113a

顺便提一下,这个问题结构很好。

 类似资料:
  • 如何聚合一个值在嵌套在Elasticsearch嵌套位置?我对一个嵌套对象没有问题,但在嵌套对象内的嵌套我感到困惑... 样本数据: 欲望结果: 在索引映射中,我将cat_a和条目字段的类型设置为嵌套,当我从工具字段查询聚合时,在cat_a的根(级别1)中没有问题,并且可以工作,但是在聚合中在rx_a(这是在第2级)我不能检索结果,它或空或显示错误,因为我的错误查询。 查询级别1 agg: 如何处

  • 该示例摘自Elasticsearch参考:https://www.elastic.co/guide/en/Elasticsearch/reference/5.3/nested.html 我的索引和这个差不多。唯一的区别是user.first和user.last是关键字类型,所以我可以对它们使用过滤器。 在两种情况下,我应该使用什么查询来获取与上面数组匹配的文档(正好是两个项,一个项是John Sm

  • null 当然有更好的方法吗?

  • 在Elasticsearch中,是否有任何方法可以将与特定查询/筛选器不匹配的嵌套对象从结果源中排除? 例如,假设一个文档在一个嵌套字段中有四个对象。查询所需的筛选器只会导致匹配对象1和3。当我们通过_source获得结果时,我们将拉回整个文档以及对象1、2、3、4。 有可能从结果中排除对象2和4吗?或者是我们必须使用应用程序端逻辑重新迭代并排除的东西?

  • 在这里,我得到了错误: “无效的术语聚合顺序路径[price>price>price.max]。术语桶只能在子聚合器路径上排序,该路径由路径中的零个或多个单桶聚合和路径末尾的最终单桶或度量聚合组成。子路径[price]指向非单桶聚合” 如果我按持续时间聚合排序,查询可以正常工作,如 那么,有什么方法可以通过嵌套字段上的嵌套聚合来排序聚合吗?

  • 我试图在c#中运行聚合查询(使用nest 5),但我不知道我得到了多少聚合作为输入以及聚合类型是什么。 例如,一个查询是:{"aggs":{"type_count":{"术语":{"field":"type"}}}} 其他查询将是:{“aggs”:{“type\u count”:{“terms”:{“field”:“type”}},“salary\u count”:{“field”:“salary