【发布时间】:2018-12-13 00:51:44
【问题描述】:
我们有一个弹性搜索文档,其中包含一个名为“Type”的字符串字段。该字段可以具有从“A”到“Z”的不同值。多个文档可以具有相同的类型,即多个文档可以具有类型“A”
我们想编写一个弹性搜索查询,最多返回 30 个这样的文档。我们希望输出根据类型在不同的组中。例如:
- 如果我们有 10 个 A 类文档,15 个 B 类文档,20 个 C 类文档,我应该得到所有 10 个 A 类文档,所有 15 个 B 类文档和 5 个 C 类文档。
- 如果我们有 0 个 A 类文档、10 个 B 类文档、15 个 C 类文档、20 个 D 类文档,我应该得到所有 10 个 B 类文档、15 个 C 类文档和 5 个 D 类文档。
- 最坏的情况:如果我们没有任何 A ... Y 类型的文档和 30 个 Z 类型的文档,我应该得到 30 个 Z 类型的文档。
我为此编写了一个非常基本的多搜索查询(总共 26 个查询),即
POST _msearch/
{"index":"<index_name>","type":"<type>"}
{"from":0,"size":30,"query":{"bool":{"must":[{"terms":{"type":["A"]}}]}}}
{"index":"<index_name>","type":"<type>"}
{"from":0,"size":30,"query":{"bool":{"must":[{"terms":{"type":["B"]}}]}}}
...
{"index":"<index_name>","type":"<type>"}
{"from":0,"size":30,"query":{"bool":{"must":[{"terms":{"type":["Z"]}}]}}}
我担心多搜索查询的执行,即对于案例 1 和案例 2,我们得到了足够的输出,即前几个查询的 30 个文档,那么我们为什么要执行其余的多搜索查询呢?一旦我们获得所需数量的结果,是否有任何方法可以停止多搜索查询操作,即一旦我们获得 30 个或更多结果就终止多搜索。
请注意:
- 我在这里给出了非常简单的条件,即不同的多重搜索的条件比仅仅基于类型更复杂。
- 我们希望输出中有多个集合,即 A 类、B 类等都在不同的集合中。 (由于这个限制,我们不得不排除无痛脚本选项)
【问题讨论】:
标签: elasticsearch elasticsearch-5 elasticsearch-painless