#elasticsearch
#эластичный поиск
Вопрос:
Я новичок в elasticsearch. Есть ли способ написать запросы, которые будут соответствовать и перечислять все документы, которые соответствуют определенным доступным полям, включая общие?
Я попытаюсь показать это на примере.
У меня есть система, в которой на основе некоторых критериев мы выдаем рекомендации. Как график. Например. начиная с продукта, имени операционной системы, архитектуры (машины), выпуска, версии и так далее. Я бы сначала хотел, чтобы они совпадали product
и osname
были общими для всего поиска. Позже выполните поиск, если архитектура имеет x86
значение if true, затем добавьте этот документ в результат, а затем, если release имеет значение of Service Pack 1
, добавьте это снова в результат. В конце результат должен содержать оба 3
документа amp; 4
docs, поскольку оба имеют общие поля product и osname, а один из запросов соответствует фразе «Пакет обновления 1», а другой соответствует «x86»
Ниже приведены 2 мои рекомендации, если запрос удовлетворяет критериям, верните этот документ. В приведенном ниже документе в качестве общих полей указаны product и osname.
PUT /support/recommendation/3
{
"recommendation":"Suggested architecture 64 Bit",
"type":"warning",
"criteria": {
"product": ["tar","zip"],
"osname": "windows",
"machine": "x86"
}
}
PUT /support/recommendation/4
{
"recommendation":"Service Pack 2 or more is needed",
"type":"error",
"criteria": {
"product": ["tar","zip"],
"osname": "windows",
"release": "Service Pack 1"
}
}
Мой запрос
GET /support/recommendation/_search
{ /*search tar, windows, 32bit(x86) amp; SP1*/
"query": {
"filtered" : {
"query": {
"bool" : {
"must": [
{"match": {
"product": "tar"
}
},
{"match": {
"osname": "Windows"
}
}
],
"must": [
{"match_phrase": {
"release": "Service Pack 1"
}}
],
"should": [
{"match": {
"machine": "x86"
}
}
]
}
}
}
}
}
Есть ли способ добиться этого?
Ответ №1:
Если вы хотите, чтобы ваши документы отображались в результате, если они соответствуют ЛИБО machine: x86, ЛИБО release: Service Pack 1 , тогда просто используйте предложение should, включающее оба.
GET /support/recommendation/_search { /*search tar, windows, 32bit(x86) amp; SP1*/
"query": {
"filtered" : {
"query": {
"bool" : {
"must": [
{"match": {
"product": "tar"
}
},
{"match": {
"osname": "Windows"
}
}
],
"should": [
{"match": {
"machine": "x86"
}
},
{"match_phrase": {
"release": "Service Pack 1"
}
}
],
"minimum_should_match" : 1
}
}
}
} }
ОБНОВЛЕНИЕ: добавлено minimum_should_match
предложение
Комментарии:
1. Спасибо за ваш быстрый ответ. Я попробовал ваш запрос, поскольку, если я
"machine": "x64"
даже изменю его, в нем будут перечислены оба документа. Но для моего результата это не должно быть так, как есть в документе3
x86
, а в документе4
нет этого критерия.2. Хм, я не понимаю. В вашем вопросе вы указали, что должны быть возвращены оба документа 3 и 4, потому что один из них соответствует критериям для
machine
, а другой соответствует критериям дляrelease
? Или вы хотите что-то еще?3. ах, подождите, теперь я понимаю, что вы имеете в виду. Интересно. Попробуйте добавить
minimum_should_match: 1
?4. отлично, успехов с ES 🙂