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



我正在使用Elasticsearch 6.3版本,我想跨多个索引进行查询。Elasticsearch 对此表示支持,我可以在 url 中提供多个索引作为逗号分隔的值,并在请求正文中提供一个查询,还可以提供大小参数来限制返回的搜索结果数量。但是,这限制了整体搜索结果的大小,并可能导致某些索引没有结果 - 因此我想从每个索引中获取前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
}
}
}
}
}
}

最新更新