Elasticsearch: как ранжировать точное совпадение? - PullRequest
0 голосов
/ 26 октября 2018

Я хочу найти элемент "vision" для одного поля, но я только что получил результаты, такие как "vision A", "vision B", "xx version", "vision" и т. Д., Используя match / match_phrace / term в DSL.

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

vision > vision A > vision B > xx version

Я проверил Точный термин Elasticsearch match , в котором изменение "index" на "not_analyzed" распознается для точного соответствия.Но в моем случае требуется не только точное совпадение, но и содержащее совпадение.

Что я могу сделать для этого случая?Спасибо!

1 Ответ

0 голосов
/ 26 октября 2018

Что вы можете сделать, чтобы достичь этого, так это включить несколько ограничений в запрос q bool/should, чтобы контролировать ранжирование.

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "name": "vision"                  <--- match on vision
        }
      },
      "should": [
        {
          "term": {
            "name.keyword": {               <--- boost exact matches on keyword field (i.e. "vision")
              "value": "vision",
              "boost": 3
            }
          }
        },
        {
          "prefix": {
            "name.keyword": {               <--- boost prefix matches on keyword field (i.e. "vision A" and "vision B"
              "value": "vision",
              "boost": 2
            }
          }
        }
      ]
    }
  }
}
  • Первый пункт будет соответствовать всем документам, которые содержат vision в своем поле name.
  • Второе предложение даст больший импульс документам, чье поле name.keyword содержит ровно vision. name.keyword обычно является полем keyword (ранее not_analyzed string).
  • Третий пункт даст несколько больший импульс документам, чье поле name.keyword начинается с vision.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...