Исключить фразу из поиска в ElasticSearch

#elasticsearch #elasticsearch-dsl #elasticsearch-dsl-py

#elasticsearch #elasticsearch-dsl #elasticsearch-dsl-py

Вопрос:

Я использую ElasticSearch (elasticsearch-dsl) и ищу ключевые слова, но хотел бы игнорировать некоторые фразы из поиска. Например. поиск по "best" и игнорирование фразы "best regards" : он должен найти документ «The Best Car bla-bla-bla С наилучшими пожеланиями» (первое совпадение правильное, второе игнорируется), но не должен совпадать с «Bla-bla-bla с наилучшими пожеланиями». В идеале он также должен выделять только фактическое совпадение без слов в ignore phrase. Я подумываю о том, чтобы отбросить 2 запроса, а затем удалить результаты игнорирования фразы из фактического поиска. Возможно ли каким-либо образом получить список совпадающих токенов с их позициями? Или есть какой-нибудь лучший подход? Я не могу добавить стоп-фразы в индекс, потому что поиск является динамическим, а игнорируемые фразы варьируются от пользователя к пользователю.

Ответ №1:

Я не уверен, что полностью понимаю ваш подход, однако, похоже, вы хотите добавить к своему запросу запрос «не должен» в сочетании с точным совпадением фраз. это выглядело бы примерно так:

 {
  "query": {
    "bool" : {
      "must" : {
        "term" : { "text_field" : "best" }
      },
      "must_not" : {
        query_string: {default_field: "text_field", query: '"best regards"'}
      },
   }
}
  

если у вас есть несколько фраз для исключения, синтаксис строки:

 '"text" OR "text1" OR ... "textn"'
  

также мне потребовалось некоторое время, чтобы понять, насколько мощны пользовательские анализаторы elasticsearch, я не уверен точно, как выглядят ваши данные и каковы ваши потребности, но если у вас их нет, вам следует взглянуть на это, это может избавить вас от многих проблем и сделать ваши запросы более эффективными.