Использование поля повышения в Elasticsearch - PullRequest
0 голосов
/ 14 января 2019

У меня проблема с пониманием работы параметра boost в Elasticsearch 6.
У меня есть индекс с четырьмя полями: id, title, content, client. Все поля имеют тип «текст».
Следующим запросом я пытаюсь придать полю заголовка больший вес:

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "europe",
            "analyzer": "standard",
            "default_operator": "AND",
            "fields": [
              "id", "title^2", "content"
            ]
          }
        },
        {
          "term": {
            "client": {
              "value": "test",
              "boost": 1
            }
          }
        }
      ]
    }
  },
  "size": 10,
  "from": 0,
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

Теперь я ожидал бы, что я получу результаты поиска, где первые попадания - это только записи, которые содержат поисковый термин в заголовке, но не обязательно в содержании. Однако я получаю только совпадения, содержащие искомый термин как в названии, так и в содержании, т. Е. Сопоставление нескольких полей.
Могу ли я как-то повлиять на это, возможно, увеличив значение повышения или переформулировав запрос? Я также прочитал кое-что о запросе dismax, но я не знаю, полезно ли это для моих целей?

1 Ответ

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

Вам необходимо использовать запрос multi match со стратегией best_fields .

В синтаксисе множественного соответствия вы можете использовать повышающий синтаксис "^ X", и вы получите доступ к различным стратегиям, чтобы настроить результат вашего запроса.

Стратегия best_field говорит о том, что между всеми искомыми полями вы сохраните только наиболее релевантное поле для оценки (а не сумму всех полей, которые бы отдавали предпочтение документу, где запрос найден в заголовке И контенте). .

Не могли бы вы попробовать:

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "europe",
            "analyzer": "standard",
            "operator": "AND",
            "fields": [
              "id", "title^2", "content"
            ],
            "type": "best_fields"
          }
        },
        {
          "term": {
            "client": {
              "value": "test",
              "boost": 1
            }
          }
        }
      ]
    }
  },
  "size": 10,
  "from": 0,
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

Кстати, стратегия best_field является стратегией по умолчанию, поэтому вы можете опустить параметр type.

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