如何在ElasticSearch中只聚合查询返回的结果

hgb9j2n6  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(2)|浏览(188)

我尝试在ElasticSearch中进行桶聚合,它只在查询返回的结果上运行。
看起来聚合在每次命中时运行,但只返回其中的一部分。这很好,但问题是从聚合返回的文档与从查询返回的文档不匹配。
以下是Map:

LOCATION_MAPPING = {
  id: { type: 'long' },
  name: { type: 'text' },
  street: { type: 'text' },
  city: { type: 'text' },
  state: { type: 'text' },
  zip: { type: 'text' },
  price: { type: 'text' },
  geolocation: { type: 'geo_point' },
  amenities: { type: 'nested' },
  reviews: { type: 'nested' },
};

以下是查询:

{
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ],
  "query": {
    "bool": {
      "filter": {
        "geo_distance": {
          "distance": "1000yd",
          "geolocation": [
            -73.990768410025,
            40.713144830193
          ]
        }
      },
      "must": {
        "multi_match": {
          "query": "new york",
          "fields": [
            "name^2",
            "city",
            "state",
            "zip"
          ],
          "type": "best_fields"
        }
      }
    }
  },
  "aggs": {
    "reviews": {
      "nested": {
        "path": "reviews"
      },
      "aggs": {
        "location": {
          "terms": {
            "field": "reviews.locationId"
          },
          "aggs": {
            "avg_rating": {
              "avg": {
                "field": "reviews.rating"
              }
            }
          }
        }
      }
    }
  }
}
nue99wik

nue99wik1#

以下资源应有助于理解您观察到的行为和您遇到的问题:
看起来聚合在每次命中时运行,但只返回其中的一部分。
是的,默认情况下,您拥有的术语聚合将仅返回前10个bucket,您可以使用size参数更新它(size 0将返回所有bucket)。参见Show all Elasticsearch aggregation buckets,相关文章。
问题是从聚合返回的文档与从查询返回的文档不匹配。
在Elasticsearch响应中,您应该看到前10个得分结果(在查询的根级别上有一个size参数,默认值为10 -参见Elasticsearch From/Size Doc)和聚合的前10个bucket。得分最高的结果可能不具有最常见的review.locationId
我认为你的选择是:

lvjbypge

lvjbypge2#

应该可以在查询结果集上进行聚合,语法应该与您的according to the docs类似。
在我的例子中,我正在做一个GET _search与一个query包括一个query_string包含orand(错误,应该是ORAND,见上述文档)。这似乎会导致所有文档都匹配,而不是预期的匹配。
下面是错误的query_string,聚合在所有文档上运行:

GET _search
{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "(description: \"my description\" or myField: \"my value\") and myOtherField: \"my other value\""
          }
        },
        {
          "range": {
            "@timestamp": {
              "gte": "now-2h"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "myAgg": {
      "terms": {
        "field": "myOtherField"
      }
    }
  }
}

由于我无法理解的原因,我正在聚合的字段没有显示为Kibana的Dev Tools中查询结果的一部分,再加上小写的andor在Kibana的“Discover”(使用KQL)上按预期工作的事实,使得更难调试查询而不是聚合的原因。
因此,如果您的聚合没有聚合查询结果,请仔细检查查询本身。

相关问题