gpt4 book ai didi

嵌套内部命中的 Elasticsearch 聚合

转载 作者:行者123 更新时间:2023-11-29 02:47:10 24 4
gpt4 key购买 nike

我在 Elasticsearch 中获取了大量数据。我的文档有一个名为“记录”的嵌套字段,其中包含具有多个字段的对象列表。

我希望能够从记录列表中查询特定对象,因此我在查询中使用了 inner_hits 字段,但这没有帮助,因为聚合使用大小 0,因此没有返回任何结果。

我没有成功地使聚合只对 inner_hits 起作用,因为无论查询如何,聚合都会返回记录内所有对象的结果。

这是我正在使用的查询:(每个文档都有first_timestamp和last_timestamp字段,记录列表中的每个对象都有一个timestamp字段)

curl -XPOST 'localhost:9200/_msearch?pretty' -H 'Content-Type: application/json' -d'    
{
"index":[
"my_index"
],
"search_type":"count",
"ignore_unavailable":true
}
{
"size":0,
"query":{
"filtered":{
"query":{
"nested":{
"path":"records",
"query":{
"term":{
"records.data.field1":"value1"
}
},
"inner_hits":{}
}
},
"filter":{
"bool":{
"must":[
{
"range":{
"first_timestamp":{
"gte":1504548296273,
"lte":1504549196273,
"format":"epoch_millis"
}
}
}
],
}
}
}
},
"aggs":{
"nested_2":{
"nested":{
"path":"records"
},
"aggs":{
"2":{
"date_histogram":{
"field":"records.timestamp",
"interval":"1s",
"min_doc_count":1,
"extended_bounds":{
"min":1504548296273,
"max":1504549196273
}
}
}
}
}
}
}'

最佳答案

您的查询非常复杂。简而言之,这是您请求的查询:

{
"size": 0,
"aggregations": {
"nested_A": {
"nested": {
"path": "records"
},
"aggregations": {
"bool_aggregation_A": {
"filter": {
"bool": {
"must": [
{
"term": {
"records.data.field1": "value1"
}
}
]
}
},
"aggregations": {
"reverse_aggregation": {
"reverse_nested": {},
"aggregations": {
"bool_aggregation_B": {
"filter": {
"bool": {
"must": [
{
"range": {
"first_timestamp": {
"gte": 1504548296273,
"lte": 1504549196273,
"format": "epoch_millis"
}
}
}
]
}
},
"aggregations": {
"nested_B": {
"nested": {
"path": "records"
},
"aggregations": {
"my_histogram": {
"date_histogram": {
"field": "records.timestamp",
"interval": "1s",
"min_doc_count": 1,
"extended_bounds": {
"min": 1504548296273,
"max": 1504549196273
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}

现在,让我通过聚合的名称来解释每一步:

  • size: 0 -> 我们对命中不感兴趣,只对聚合感兴趣
  • nested_A -> data.field1 处于记录之下,因此我们将范围扩大到记录
  • bool_aggregation_A -> 按data.field1过滤:value1
  • reverse_aggregation -> first_timestamp 不在嵌套文档中,我们需要从记录中找出范围
  • bool_aggregation_B -> 按first_timestamp 范围过滤
  • nested_B -> 现在,我们再次为 timestamp 字段(位于记录下)的记录范围
  • my_histogram -> 最后,按timestamp 字段聚合日期直方图

关于嵌套内部命中的 Elasticsearch 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46044671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com