Elasticsearch中已排序大小的查询的联合

时间:2015-05-12 16:07:22

标签: elasticsearch

我有Elasticsearch中的文档,如:

{
    "key1":1,
    "key2":2,
    "key3":3
}

我想创建一个返回30个文档的查询,这些文档是:

的并集
  • key1 +
  • 中值最高的10个文档
  • key2 +
  • 中值最高的10个文档
  • key3
  • 中值最高的10个文档

我有两个想法:

  1. 使用DisMaxQuery - 但我无法使用排序。可能错过了一些东西..
  2. 使用MultiSearch - 但我想获得一个结果对象
  3. 任何建议都会有所帮助!

1 个答案:

答案 0 :(得分:1)

另一个想法是在termskey1key2上添加三个key3聚合,每个聚合按max子聚合排序(为了获取每个密钥的最高值),并为每个密钥添加另一个top_hits子聚合。每个密钥可能会少于10个文档,如果这是一个问题,您可以将size聚合的terms增加到2或3,然后在客户端过滤掉不需要的热门命中。< / p>

{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "topkey1": {
      "terms": {
        "field": "key1",
        "size": 1,
        "order": {
          "max_key1": "desc"
        }
      },
      "aggs": {
        "max_key1": {
          "max": {
            "field": "key1"
          }
        },
        "key1_tophits": {
          "top_hits": {
            "size": 10
          }
        }
      }
    },
    "topkey2": {
      "terms": {
        "field": "key2",
        "size": 1,
        "order": {
          "max_key2": "desc"
        }
      },
      "aggs": {
        "max_key2": {
          "max": {
            "field": "key2"
          }
        },
        "key2_tophits": {
          "top_hits": {
            "size": 10
          }
        }
      }
    },
    "topkey3": {
      "terms": {
        "field": "key3",
        "size": 1,
        "order": {
          "max_key3": "desc"
        }
      },
      "aggs": {
        "max_key3": {
          "max": {
            "field": "key3"
          }
        },
        "key_tophits": {
          "top_hits": {
            "size": 10
          }
        }
      }
    }
  }
}