#elasticsearch
#elasticsearch
Вопрос:
Я пытаюсь написать запрос elasticsearch, который возвращает хиты, содержащие в текстовом поле «описание» либо значение «Дональд Трамп», либо значение «Джо Байден», но не оба. Я попытался с помощью «должен»:
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"match": {
"author.description": {
"query": "Joe Biden"
}
}
},
{
"match": {
"author.description": {
"query": "Donald Trump"
}
}
}
]
}
}
Но, как и ожидалось, этот возврат попадает в те, которые содержат либо одну, либо обе указанные строки. Возможно ли это в elasticsearch? Я не нашел похожего вопроса на SO, и документация elasticsearch мне тоже не очень помогла.
Ответ №1:
Прямого способа достичь вашего варианта использования нет, но вы можете использовать комбинацию bool query
Добавление рабочего примера с индексными данными, сопоставлением, поисковым запросом и результатом поиска
Сопоставление индексов:
{
"mappings": {
"properties": {
"author": {
"properties": {
"description": {
"type": "text"
}
}
}
}
}
}
Индексировать данные:
{
"author": {
"description": "Joe Biden"
}
}
{
"author": {
"description": "Donald Trump"
}
}
{
"author": {
"description": [
"Donald Trump",
"Joe Biden"
]
}
}
Поисковый запрос:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": {
"match": {
"author.description": {
"query": "Joe Biden"
}
}
},
"must_not": {
"match": {
"author.description": {
"query": "Donald Trump"
}
}
}
}
},
{
"bool": {
"must": {
"match": {
"author.description": {
"query": "Donald Trump"
}
}
},
"must_not": {
"match": {
"author.description": {
"query": "Joe Biden"
}
}
}
}
}
],
"minimum_should_match": 1
}
}
}
Результат поиска:
"hits": [
{
"_index": "65131464",
"_type": "_doc",
"_id": "1",
"_score": 1.0470967,
"_source": {
"author": {
"description": "Joe Biden"
}
}
},
{
"_index": "65131464",
"_type": "_doc",
"_id": "2",
"_score": 1.0470967,
"_source": {
"author": {
"description": "Donald Trump"
}
}
}
]
Комментарии:
1. Спасибо, я не думал делать это как подзапросы. Это работает.