#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"]
}
}
}