elasticsearch - 如何限制多索引搜索查询中每个索引的搜索结果?
问题描述
我正在使用 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
}
}
}
}
}
}
推荐阅读
- linux - 使用 at 命令(预定脚本)运行 bash 脚本不起作用
- vue.js - 将 Formstack 嵌入 Vuejs
- groovy - 如何从 groovy 元素访问 Camel 的属性 CamelLoopIndex?
- java - 我想通过 Java Rest api 在 Google Duo 上创建一个用户。遵循文档但出现错误
- colors - highlightcolor 与 monokai for atom 不同,与 sublime 文本中的不同
- c# - 缓动功能而不从 Freezable 继承?
- c# - 使用泛型和单链表(错误 CS0311)
- python - 为什么即使我在 Pipfile 中指定了版本,依赖项也会默认为最新版本?
- java - REST 客户端如何解析 REST Web 服务中的巨大 JSON 响应
- c - 为 SBSFU 配置 AES 密钥后,无法在 STM32WB55 上刷新任何代码