如何限制多索引搜索查询中每个索引的搜索结果?

时间:2019-08-19 10:54:44

标签: elasticsearch lucene

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

我尝试使用多重搜索api(_msearch),但是看来我必须为所有索引提供相同的查询和大小,并且可行,但是我无法获得整个结果的单个汇总,有什么办法解决这两个问题?

1 个答案:

答案 0 :(得分:1)

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