我们有一个名为"Type“的字符串字段的弹性搜索文档。该字段可以具有从"A“到"Z”的不同值。多个文档可以具有相同的类型,即多个文档可以具有"A“类型
我们希望编写一个弹性搜索查询,最多返回这些文档中的30个。根据类型,我们希望输出在不同的组中。例如:
为此,我编写了一个非常基本的多搜索查询(总共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或更多的结果。
请注意:
发布于 2018-07-05 21:58:26
看起来,使用size
和sort
进行一次搜索就可以实现您想要的结果,另外还可以选择使用bool
将查询组合为一个。
我能否过早地终止多搜索查询?
不是的。从多搜索文档中我们可以得出这样的结论。它以一定的并发性执行多个搜索请求,并仅在所有查询完成后才发回结果。
它非常类似于散装API,一种轻松执行并行请求的方法。
我能得到匹配的文档,但按自定义的顺序吗?
是的,这就是sort
的用途。要实现原始帖子中描述的行为,只需使用以下调用就足够了:
POST /<index_name>/<index_type>/_search?sort=type:asc&size=30
我可以对多个索引进行一次搜索请求,但仍然使用sort
是的,您只需要定义索引列表:
POST /multisearch1,mutlisearch2/<index_type>/_search?sort=type:asc&size=30
或者通配符表达式:
POST /multisearch*/<index_type>/_search?sort=type:asc&size=30
我能按任意顺序排序吗?
是的,例如使用基于脚本的排序。例如,如果您希望按以下顺序查看结果中的type
:X
、C
、A
,您可以编写如下脚本:
POST /<index_name>/<type>/_search
{
"size": 30,
"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """
int r = 1;
if(doc['type'].value == 'X') {
r = 100;
} else if(doc['type'].value == 'C') {
r = 10;
} else if(doc['type'].value == 'A') {
r = 5;
}
r;
"""
},
"order": "desc"
}
}
}
这也适用于多个集合(如上面的查询)。
如果我有一个依赖于type
值的复杂查询,我可以这样做吗?
是的,没问题,请使用bool
查询,例如:
POST /<index_name>/<type>/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"type": "A"
}
},
{
"match": {
"description": "Quick fox"
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"type": "X"
}
},
{
"match": {
"description": "Quick bear"
}
}
]
}
}
]
}
},
"size": 30,
"sort": {
"_script": {
"type": "number",
"script": {
"lang": "painless",
"source": """
int r = 1;
if(doc['type'].value == 'X') {
r = 100;
} else if(doc['type'].value == 'C') {
r = 10;
} else if(doc['type'].value == 'A') {
r = 5;
}
r;
"""
},
"order": "desc"
}
}
}
希望这能帮上忙!
https://stackoverflow.com/questions/51176058
复制相似问题