эластичный поиск, придающий больший вес различным областям и сценариям - PullRequest
0 голосов
/ 01 января 2019

У меня есть этот запрос ES:

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "test",
            "fields": [
              "name^-1.0",
              "id^-1.0",
              "address.city^-1.0",
              "address.street^-1.0"
            ],
            "type": "phrase_prefix",
            "lenient": "true"
          }
        }
      ],
      "boost": 1.0,
      "minimum_should_match": "1"
    }
  },
  "from": 0,
  "size": 20
}

, и в настоящее время, когда я ищу человека с именем john, я получу кучу результатов, в которых id, address.city, address.street содержит Джона вих, это хорошо, но я хочу, чтобы name был более важным, а также, если бы в моем списке было 2 человека john и кто-то с двумя именами, такими как george john, я бы хотел, чтобы просто john появилсяпервый.

я могу это сделать?:)

1 Ответ

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

Чтобы сделать любое поле более важным, чем другие, вы можете установить его усиление на более высокое значение.Так что если fieldA^4 и fieldB^1, это означает, что fieldA в 4 раза важнее, чем fieldB.Поэтому вы можете задать более высокое значение усиления для поля name, чтобы сделать его более важным для оценки.

Для второй точки документ со значением поля name как john будет иметь более высокий балл, чем с документом со значением поля name как george john (при условии, что другие поля имеют те же данныев обоих документах) .Причина, по которой вы получаете второй документ (джордж джон) выше в результате, заключается в том, что вы увеличили все поля с отрицательным значением.

Таким образом, чтобы удовлетворить обе ваши точки

  • дает более высокий импульс для name
  • делает повышение для всех полей как положительное значение.

Таким образом, запрос должен выглядеть следующим образом:

{
  //"explain": true,
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "john",
            "fields": [
              "name^4.0",
              "id^1.0",
              "address.city^1.0",
              "address.street^1.0"
            ],
            "type": "phrase_prefix",
            "lenient": "true"
          }
        }
      ],
      "boost": 1,
      "minimum_should_match": "1"
    }
  },
  "from": 0,
  "size": 20
}

Чтобы больше узнать о том, как оценка для соответствующего документа рассчитывается по эластичности, вы можете использовать "explain": true в своем запросе.Это даст подробные шаги в результате, сделанные эластичным для расчета балла.

...