Отдавайте предпочтение точным совпадениям, а не nGram в elasticsearch

Я пытаюсь сопоставить поле как nGram и «точное» совпадение и сделать так, чтобы точные совпадения отображались первыми в результатах поиска. Это ответ на аналогичный вопрос , но я изо всех сил пытаюсь заставить его работать.

Независимо от того, какое значение повышения я укажу для поля «точное», я каждый раз получаю один и тот же порядок результатов. Вот как выглядит мое сопоставление полей:

"name" : {
    "type" : "multi_field",
    "fields" : {
      "name" : {
        "type" : "string",
        "boost" : 2.0,
        "analyzer" : "ngram"
      },
      "exact" : {
        "type" : "string",
        "boost" : 4.0,
        "analyzer" : "simple",
        "include_in_all" : false
      }
    }
  }

И вот как выглядит запрос:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "fields":["name","name.exact"],
                    "query":"Woods"
                }
            }
        }
    }
}

person Calin    schedule 30.09.2014    source источник


Ответы (2)


Недооценка того, как рассчитывается оценка

У Elasticsearch есть возможность создавать объяснение для каждого результата поиска. установив для параметра объяснения значение true

POST  <Index>/<Type>/_search?explain&format=yaml
{
"query" : " ....."
}

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

вывод eplian может быть сложнее читать в json, поэтому добавление format=yaml облегчает чтение

Понимание того, почему документ соответствует или нет

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

GET <Index>/<type>/<id>/_explain
{
"query": "....."
}
person Abdel    schedule 30.09.2014
comment
Полезно, спасибо. Страница, с которой вы получили эту информацию, называется elasticsearch.org. /guide/en/elasticsearch/guide/current/ (ссылка может помочь другим). - person Calin; 02.10.2014

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

{
    "query": {
        "filtered": {
            "query": {
                "multi_match": { # changed from "query_string"
                    "fields": ["name","name.exact"],
                    "query": "Woods",
                    # added this so the engine does a "sum of" instead of a "max of"
                    # this is deprecated in the latest versions but works with 0.x
                    "use_dis_max": false
                }
            }
        }
    }
}

Теперь результаты учитывают «точное» совпадение и складываются в счет.

person Calin    schedule 01.10.2014