Elasticsearch назначает приоритет одному полю в запросе - PullRequest
0 голосов
/ 01 мая 2019

Я создал эластичный индекс документов, имеющих поле заголовка и текстовое поле.Учитывая запрос, желаемое поведение для моего поиска состоит в том, что он first проверяет поле заголовка и, если есть какие-либо документы, где заголовок "хорошо" соответствует запросу,тогда эти документы должны быть на первом месте.Только после хороших совпадений заголовков должны быть возвращены документы с хорошим совпадением текста.

Под «хорошим совпадением заголовков» я подразумеваю что-то вроде «запроса близко к некоторому подмножеству заголовка, где закрытие означаетРасстояние Левинштейна меньше некоторого заданного числа ».Это пороговое условие.Таким образом, либо заголовок является «хорошим» соответствием, и должен иметь высокий рейтинг, либо нет, и не должен получать никакой выгоды за получение «некоторого» соответствия с запросом.Результат является двоичным.

Таким образом, если есть запрос «Как работать в саду, как лучший», то документ с заголовком «Сад как лучший» должен быть ранжирован первым, за которым следуют документы, которые в своем запросе хорошо соответствуют запросу."текстовое поле.Документ с заголовком «Бюджетное садоводство» не должен получать бонусы за то, что в заголовке указано «Садоводство», потому что это недостаточно хороший матч.

Вот моя попытка.Это использует библиотеку Pythonastic_dsl.Но эквивалент JSON должен быть очевиден.

s = Search()

initiated = s.query(
    "multi_match",
    query=query,
    fields=[
        'title^280',
        'text^1'],
    type='best_fields',
    fuzziness='AUTO')

Как вы можете видеть, я провел многократное совпадение, в котором поле "title" придало гораздо большую важность.Я также учел некоторую нечеткость в том, что не знал точного написания слов в названии.Индекс также остановлен.Этот подход был в основном успешным, но у меня было два нежелательных поведения:

  1. Документы, заголовки которых имеют что-то общее с запросом, выглядят очень высокими.Например, вышеприведенный запрос будет сопоставлять документ с заголовком «разбивка бюджета» выше, чем документ с намного лучшим соответствием текстового поля.Это потому, что нет порога.
  2. Документы, которые имеют очень хорошее совпадение тела, по-прежнему отображаются выше, чем документы, заголовок которых буквально является точной строкой запроса.

Как я могу адаптировать свой запрос для получения желаемого поведения?Спасибо.

1 Ответ

0 голосов
/ 03 мая 2019

На самом деле это не проверялось, но https://www.elastic.co/guide/en/elasticsearch/reference/master/query-dsl-function-score-query.html кажется многообещающим для вашего случая использования, вы можете попытаться реализовать "порог" с его помощью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...