Требуется совпадение фраз в Elasticsearch SimpleStringQuery

#elasticsearch #elasticsearch-dsl

#elasticsearch #elasticsearch-dsl

Вопрос:

Я создаю простую поисковую систему, используя Elasticsearch 7.7 и пакет python elasticsearch_dsl версии 7.0.0. Я использую поиск simple_query_string, потому что я хотел бы включить наиболее распространенные функции поиска (логические операторы, поиск по фразе) без необходимости самостоятельно анализировать запрос. Это в основном работает хорошо, за исключением функциональности сопоставления фраз.

Я хотел бы убедиться, что все результаты будут включать совпадение фраз, если оно есть в запросе. Например, как работает Google — если я буду искать "green eggs" and ham , не будет результатов, которые не включают «зеленые яйца».

Предположим, у меня есть 3 документа в моем индексе:

 {
   "question":"I love my phrase",
   "background: "dont you"
},
{
   "question":"I love my phrase",
   "background: "and other terms"
},
{
   "question":"I have other terms",
   "background: "and more"
}
  

Что я вижу сейчас:

Как и ожидалось, приведенный ниже запрос возвращает только первые два документа, в одном из полей которых есть «моя фраза».

     {
      'simple_query_string':
        {
          'query': '"my phrase"',
          'fields': ['question', 'background']
        }
     }

  

Вопреки тому, что я ожидаю, приведенный ниже запрос вернет все 3 результата, причем 3-й набрал больше, чем 1-й.

     {
      'simple_query_string':
        {
          'query': '"my phrase" other terms',
          'fields': ['question', 'background']
        }
     }

  

Как я могу изменить свой запрос так, чтобы поиск «моей фразы» другие термины» не возвращал 3-й документ, потому что он не содержит поиска по фразе, но оценка 2-го документа выше, чем 1-го, потому что он содержит дополнительные условия поиска за пределами фразы?

Вещи, которые я пробовал, которые не сработали:

  • 'query': '"my phrase" AND (other terms)'
  • 'query': '"my phrase" AND other terms'

Спасибо

Ответ №1:

Вопреки тому, что я ожидаю, приведенный ниже запрос вернет все 3 результата

По умолчанию слова в запросе объединяются с OR оператором: см. Описание default_operator параметра в simple_query_string документации. Ваш второй запрос интерпретируется как "my phrase" OR other OR terms , поэтому он вернет все 3 результата: каждый документ содержит хотя бы один из терминов "my phrase" , other , terms .

Как я могу изменить свой запрос так, чтобы поиск «моей фразы» другие термины» не возвращал 3-й документ, потому что он не содержит поиска по фразе, но оценка 2-го документа выше, чем 1-го, потому что он содержит дополнительные условия поиска за пределами фразы?

AFAIK, это невозможно с simple_query_string поиском. Вы можете попробовать использовать поиск query_string, который имеет функцию с именем boolean operators . Используя эту функцию, вы можете написать запрос, который обеспечит желаемый результат:

 {
  "query": {
    "query_string": {
      "query": " "my phrase" other terms",
      "fields": ["question", "background"]
    }
  }
}