#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, я не уверен точно, как выглядят ваши данные и каковы ваши потребности, но если у вас их нет, вам следует взглянуть на это, это может избавить вас от многих проблем и сделать ваши запросы более эффективными.