我使用的是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/