Поисковый запрос в elasticsearch, который возвращает результат, который соответствует либо значению_1, либо значению_2, но не обоим

#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. Спасибо, я не думал делать это как подзапросы. Это работает.