有没有办法让弹性搜索在聚合期间返回每个生成的桶的命中?

时间:2014-03-13 05:27:52

标签: elasticsearch aggregation

现在我有这样的查询:

{
  "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个单独的查询?

3 个答案:

答案 0 :(得分:6)

为了扩展菲利普的答案,似乎top_hits aggregation就是你想要的,例如。

{
  "query": {
    ... snip ...
  },
  "aggs": {
    "query": {
      "terms": {
        "field": "query",
        "size": 3
      },
      "aggs": {
        "top": {
          "top_hits": {
            "size": 42
          }
        }
      }
    }
  }
}

答案 1 :(得分:3)

您的query使用完全匹配(matchrange)和二进制逻辑(mustbool),因此应该转换为{{ 3}}:

"filtered": {
 "filter": {
    "bool": {
       "must": [
          {
             "term": {
                "uuid": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxxx"
             }
          },
          {
             "range": {
                "date": {
                   "from": "now-12h",
                   "to": "now"
                }
             }
          }
       ]
    }
 }

关于聚合,

  

返回的匹配不代表返回的所有存储桶。所以如果有条款用于术语'' b'和' c'我想要有代表那些桶的命中

也许您正在寻求控制存储桶的范围?您可以use filters instead使其不受queryfilter的影响。

请记住,Elasticsearch不会" group"以任何方式命中 - 它总是根据分数和其他排序选项排序的平面列表。

可以在嵌套结构中组织聚合,并按特定顺序返回计算值或提取值。在terms聚合的情况下,它是递减计数(最高命中数)。响应的hits部分决不会受到您选择的聚合的影响。同样,您在聚合部分找不到hits

如果您的目标是按特定字段对文档进行分组,是的,您需要在当前的Elasticsearch版本中运行多个查询。

答案 2 :(得分:2)

我不是百分百肯定,但我认为在当前版本的Elasticsearch(1.2.x)中无法做到这一点。好消息是版本1.3.x将会发布:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html