【问题标题】:Is there a way to have elasticsearch return a hit per generated bucket during an aggregation?有没有办法让弹性搜索在聚合期间返回每个生成的桶的命中?
【发布时间】:2014-04-17 15:59:48
【问题描述】:

现在我有这样的查询:

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

【问题讨论】:

  • 您的问题中“不排队”是什么意思?
  • 返回的命中并不代表所有返回的桶。因此,如果有术语“a”、“b”和“c”的存储桶,我也希望有代表这些存储桶的命中

标签: elasticsearch aggregation


【解决方案1】:

为了扩展 Filipe 的答案,top_hits aggregation 似乎是您正在寻找的,例如

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

【讨论】:

    【解决方案2】:

    您的query 使用完全匹配(matchrange)和二进制逻辑(mustbool),因此可能应该转换为 use filters instead

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

    至于聚合,

    返回的命中并不代表所有返回的桶。因此,如果有术语“a”、“b”和“c”的存储桶,我也希望有代表这些存储桶的命中

    也许您希望控制存储桶的范围?可以make an aggregation bucket global,使其不受queryfilter的影响。

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

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

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

    【讨论】:

      【解决方案3】:

      我不是 100% 确定,但我认为在当前版本的 Elasticsearch (1.2.x) 中没有办法做到这一点。好消息是 1.3.x 版本会发布:

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

      【讨论】:

        猜你喜欢
        • 2019-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-31
        • 2017-09-25
        • 1970-01-01
        相关资源
        最近更新 更多