Похоже, что вы можете достичь того, что вы хотите, с помощью одного поиска с size
и sort
, а также опционально с помощью bool
объединить запросы в один.
Могу ли я досрочно завершить многопользовательский запрос?
Нет. Из документации Multi Search мы можем сделать вывод. Он выполняет несколько поисковых запросов с определенным уровнем параллелизма и отправляет результат только после завершения всех запросов.
Это очень похоже на Bulk 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"
}
}
}
Надеюсь, это поможет!