现在我有这样的查询:
{
"query": {
"bool": {
"must": [
{
"match": {
"uuid": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxxx"
}
},
{
"range": {
"date": {
"from": "now-12h",
"to": "now"
}
}
}
]
}
},
"aggs": {
"query": {
"terms": [
{
"field": "query",
"size": 3
}
]
}
}
}
聚合效果非常好,但我似乎无法找到控制返回的命中数据的方法,我可以使用dsl顶部的size参数,但返回的匹配不会返回与存储桶的顺序相同,因此存储桶结果与命中结果不对齐。有没有办法纠正这个问题,还是我必须发出2个单独的查询?
答案 0 :(得分:6)
为了扩展菲利普的答案,似乎top_hits aggregation就是你想要的,例如。
{
"query": {
... snip ...
},
"aggs": {
"query": {
"terms": {
"field": "query",
"size": 3
},
"aggs": {
"top": {
"top_hits": {
"size": 42
}
}
}
}
}
}
答案 1 :(得分:3)
您的query
使用完全匹配(match
和range
)和二进制逻辑(must
,bool
),因此应该转换为{{ 3}}:
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"uuid": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxxx"
}
},
{
"range": {
"date": {
"from": "now-12h",
"to": "now"
}
}
}
]
}
}
关于聚合,
返回的匹配不代表返回的所有存储桶。所以如果有条款用于术语'' b'和' c'我想要有代表那些桶的命中
也许您正在寻求控制存储桶的范围?您可以use filters instead使其不受query
或filter
的影响。
请记住,Elasticsearch不会" group"以任何方式命中 - 它总是根据分数和其他排序选项排序的平面列表。
可以在嵌套结构中组织聚合,并按特定顺序返回计算值或提取值。在terms
聚合的情况下,它是递减计数(最高命中数)。响应的hits
部分决不会受到您选择的聚合的影响。同样,您在聚合部分找不到hits
。
如果您的目标是按特定字段对文档进行分组,是的,您需要在当前的Elasticsearch版本中运行多个查询。
答案 2 :(得分:2)
我不是百分百肯定,但我认为在当前版本的Elasticsearch(1.2.x)中无法做到这一点。好消息是版本1.3.x将会发布: