我尝试在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"
}
}
}
}
}
}
}
}
2条答案
按热度按时间nue99wik1#
以下资源应有助于理解您观察到的行为和您遇到的问题:
看起来聚合在每次命中时运行,但只返回其中的一部分。
是的,默认情况下,您拥有的术语聚合将仅返回前10个bucket,您可以使用size参数更新它(size 0将返回所有bucket)。参见Show all Elasticsearch aggregation buckets,相关文章。
问题是从聚合返回的文档与从查询返回的文档不匹配。
在Elasticsearch响应中,您应该看到前10个得分结果(在查询的根级别上有一个size参数,默认值为10 -参见Elasticsearch From/Size Doc)和聚合的前10个bucket。得分最高的结果可能不具有最常见的
review.locationId
。我认为你的选择是:
lvjbypge2#
应该可以在查询结果集上进行聚合,语法应该与您的according to the docs类似。
在我的例子中,我正在做一个
GET _search
与一个query
包括一个query_string
包含or
和and
(错误,应该是OR
和AND
,见上述文档)。这似乎会导致所有文档都匹配,而不是预期的匹配。下面是错误的
query_string
,聚合在所有文档上运行:由于我无法理解的原因,我正在聚合的字段没有显示为Kibana的Dev Tools中查询结果的一部分,再加上小写的
and
和or
在Kibana的“Discover”(使用KQL)上按预期工作的事实,使得更难调试查询而不是聚合的原因。因此,如果您的聚合没有聚合查询结果,请仔细检查查询本身。