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

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

最佳答案

解决方案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
          }
        }
      }
    }
  }
}

关于elasticsearch - 如何限制多索引搜索查询中每个索引的搜索结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57555331/

10-17 03:04