我使用的是Elasticsearch版本6.3,我想跨多个索引进行查询.Elasticsearch支持此功能,我可以在请求正文中使用一个查询在URL中以逗号分隔值的形式提供多个索引,并提供size参数以限制返回的搜索结果数。但是,这限制了整个搜索结果的大小,并且可能导致某些索引没有结果-因此,我想从每个索引中获取前n个结果。
我尝试使用多重搜索api(_msearch),但是看来我必须为所有索引提供相同的查询和大小,并且可行,但是我无法获得整个结果的单个汇总,有什么办法解决这两个问题?
答案 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
}
}
}
}
}
}