ElasticSearch Field Boost - PullRequest
       3

ElasticSearch Field Boost

0 голосов
/ 23 января 2019

У меня есть следующий ElasticSearch DSL запрос

query = Q("bool", should=[
    Q("match_phrase", title=term),
    Q("match_phrase", description=term),
    Q("match_phrase", name=term),
    Q("match_phrase", some_other_field=term),
])

Я хотел бы повысить оценку, когда term соответствует полю name, а также хотел бы уменьшить оценку, когда совпадение находится в поле description.

Я пробовал много вещей, таких как:

Q("match_phrase", description={'query': term, boost: '0.1'}),

или

Q("match_phrase", name={'query': term, boost: 10}),

Но не мог заставить его работать. Я также попытался объединить должен с обязательным и т. Д., Но не зашел слишком далеко - даже не стоит делиться Есть ли простой способ сделать это без переиндексации / переоценки всех моих документов? Также будет полезен ответ с запросом ES (а не ES-DSL).

1 Ответ

0 голосов
/ 23 января 2019

Этого можно добиться, используя запрос multi_match и задав тип most_fields.По умолчанию в запросе multi_match используется тип best_fields, который

Находит документы, соответствующие любому полю, но использует _score из лучшего поля.

Поскольку вы хотите манипулировать счетомпо нескольким соответствующим полям вы должны установить тип как most_fields, который

Находит документы, которые соответствуют любому полю, и объединяет _score из каждого поля.

Поэтомузапрос будет выглядеть следующим образом:

{
  "query": {
    "multi_match": {
      "query": "match",
      "type": "most_fields",
      "fields": [
        "title",
        "description^-1",
        "name^5",
        "some_other_field"
      ]
    }
  }
}

В приведенном выше запросе вы могли заметить, что я дал названию повышение на 5, чтобы получить более высокий балл, если совпадение в name и -1 (-ve), чтобы уменьшитьсчет совпадения находится в поле description.

Таким образом, вы можете поиграться со значениями усиления, чтобы получить желаемый счет.

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