我正在使用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
}
}
}
}
}
}