首页 > 解决方案 > 如何限制多索引搜索查询中每个索引的搜索结果?

问题描述

我正在使用 Elasticsearch 6.3 版,我想跨多个索引进行查询。Elasticsearch 支持这一点,我可以在 url 中将多个索引作为逗号分隔值,在请求正文中使用一个查询,还可以提供 size 参数来限制数量返回的搜索结果。但是,这限制了整体搜索结果的大小,并且可能导致某些索引没有结果 - 所以我想从每个索引中获取前 n 个结果。

我尝试使用多搜索 api(_msearch),但似乎我必须为所有索引提供相同的查询和大小并且有效,但我无法对整个结果进行单一聚合,有什么办法可以解决这两个问题?

标签: elasticsearchlucene

解决方案


解决方案1:

您在_msearch查询的正确路径上。我要做的是为每个索引发出一个查询(没有聚合!),该查询具有您想要的索引大小,以及另一个仅针对聚合的查询,如下所示:

{ "index": "index1" }
{ "size": 5, "query": { ... }}
{ "index": "index2" }
{ "size": 5, "query": { ... }}
{ "index": "index3" }
{ "size": 5, "query": { ... }}
{ "index": "index1,index2,index3" }
{ "size": 0, "query": { ... }, "aggs": { ... } }

因此,前三个查询将返回三个索引中每一个的文档命中,最后一个查询将返回对所有索引计算的聚合,但不返回文档。

解决方案2:

如果您的尺寸较小,另一种解决此问题的方法是在部件中使用单个查询,query然后聚合索引名称并使用 检索每个索引的命中top_hits,如下所示:

POST index1,index2,index3/_search
{
  "size": 0,
  "query": { ... },
  "aggs": {
    "indexes": {
      "terms": {
        "field": "_index",
        "size": 50
      },
      "aggs": {
        "hits": {
          "top_hits": {
            "size": 5
          }
        }
      }
    }
  }
}

推荐阅读