Нечеткий процент соответствия

Когда я запрашиваю нечеткое соответствие следующим образом, elasticsearch по-прежнему возвращает только _score. Но вместо этого я ожидаю совпадения в процентах на основе нечеткого алгоритма. Я думал, что это простая настраиваемая вещь, но я не нашел ничего из этого, так как обычно отображается процент соответствия для результата нечеткого совпадения.

Как это можно сделать? Или это не обычная «практика» в elasticsearch? Но то, что я нашел в большинстве пользовательских интерфейсов, действительно показывает процент совпадения для нечеткого совпадения.

 "query": { 
        "fuzzy": {
                "name": {
                    "value": "Shahid"
                }
            }
      }

Ответ:

"hits" : [{
    "_index" : "users",
    "_type" : "user",
    "_id" : "5sadsadsaddas",
    "_score" : 0.11127616,
    "fuzzyMatchPercentage": 100% // I expect something like this here
    "_source" : {
      "name" : "Shahid",
      "email" : "[email protected]",
      "city" : "mumbai"
    }
  },

person c448548    schedule 13.10.2019    source источник
comment
нет, это невозможно сделать с помощью стандартного elasticsearch   -  person Mysterion    schedule 13.10.2019


Ответы (1)


Как упоминалось в комментарии, fuzzy-запрос не работает в Elasticsearch. По умолчанию результаты поиска сортируются по убыванию оценки, где оценка указывает, насколько хорошо документ соответствует определенному запросу. Аспект нечеткости включен в расчет этой оценки: чем точнее/менее нечетко соответствует запрос, тем выше оценка. Вы можете убедиться в этом, запросив подробное объяснение оценки (в Elasticsearch v7.x аспект нечеткости включен в расчет коэффициента повышения). Посмотрите на следующий пример:

<сильный>1. Индексирование двух образцов документов (один с правильным именем, другой с ошибкой)

POST fuzzy/_bulk
{"index":{"_id":1}}
{"name": "Shahid"}
{"index":{"_id":2}}
{"name": "Shahib"}

<сильный>2. Поиск по fuzzy-запросу по имени "Шахид"

GET fuzzy/_search
{
  "explain": true, 
  "query": {
    "fuzzy": {
      "name": {
        "value": "Shahid"
      }
    }
  }
}

<сильный>3. Пункт оценки и объяснения для обоих соответствующих документов

Для правильно написанного документа («Шахид»):

    "_explanation" : {
      "value" : 0.57762265,
      "description" : "sum of:",
      "details" : [
        {
          "value" : 0.57762265,
          "description" : "weight(name:shahid in 0) [PerFieldSimilarity], result of:",
          "details" : [
            {
              "value" : 0.57762265,
              "description" : "score(freq=1.0), product of:",
              "details" : [
                {
                  "value" : 1.8333334,
                  "description" : "boost",
                  "details" : [ ]
                },
                {
                  "value" : 0.6931472,
                  "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                  "details" : [
                    {
                      "value" : 1,
                      "description" : "n, number of documents containing term",
                      "details" : [ ]
                    },
                    {
                      "value" : 2,
                      "description" : "N, total number of documents with field",
                      "details" : [ ]
                    }
                  ]
                },
                {
                  "value" : 0.45454544,
                  "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                  "details" : [
                    {
                      "value" : 1.0,
                      "description" : "freq, occurrences of term within document",
                      "details" : [ ]
                    },
                    {
                      "value" : 1.2,
                      "description" : "k1, term saturation parameter",
                      "details" : [ ]
                    },
                    {
                      "value" : 0.75,
                      "description" : "b, length normalization parameter",
                      "details" : [ ]
                    },
                    {
                      "value" : 1.0,
                      "description" : "dl, length of field",
                      "details" : [ ]
                    },
                    {
                      "value" : 1.0,
                      "description" : "avgdl, average length of field",
                      "details" : [ ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }

Для неправильно написанного документа («Шахиб»):

    "_explanation" : {
      "value" : 0.46209806,
      "description" : "sum of:",
      "details" : [
        {
          "value" : 0.46209806,
          "description" : "weight(name:shahib in 1) [PerFieldSimilarity], result of:",
          "details" : [
            {
              "value" : 0.46209806,
              "description" : "score(freq=1.0), product of:",
              "details" : [
                {
                  "value" : 1.4666666,
                  "description" : "boost",
                  "details" : [ ]
                },
                {
                  "value" : 0.6931472,
                  "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                  "details" : [
                    {
                      "value" : 1,
                      "description" : "n, number of documents containing term",
                      "details" : [ ]
                    },
                    {
                      "value" : 2,
                      "description" : "N, total number of documents with field",
                      "details" : [ ]
                    }
                  ]
                },
                {
                  "value" : 0.45454544,
                  "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                  "details" : [
                    {
                      "value" : 1.0,
                      "description" : "freq, occurrences of term within document",
                      "details" : [ ]
                    },
                    {
                      "value" : 1.2,
                      "description" : "k1, term saturation parameter",
                      "details" : [ ]
                    },
                    {
                      "value" : 0.75,
                      "description" : "b, length normalization parameter",
                      "details" : [ ]
                    },
                    {
                      "value" : 1.0,
                      "description" : "dl, length of field",
                      "details" : [ ]
                    },
                    {
                      "value" : 1.0,
                      "description" : "avgdl, average length of field",
                      "details" : [ ]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }

<сильный>4. Заключение К сожалению, нет подробного объяснения буст-фактора (проблема с Elasticsearch), но из примера видно, что это единственная разница в отношении оценки двух документов:

  • Шахид: _score: 0,57762265 / повышение: 1,8333334
  • Шахиб: _score: 0,46209806 / повышение: 1,4666666
person Daniel Schneiter    schedule 13.10.2019
comment
@c448548 (stackoverflow.com/users/12008586/c448548), укажите, решил ли ответ вашу проблему - person Daniel Schneiter; 06.11.2019