Нечеткое совпадение не удается, но точное совпадение проходит - PullRequest
0 голосов
/ 23 октября 2018

Я строю запрос ElasticSearch, используя Fuzzy Matching, чтобы сопоставить пользователя в системе.Когда он запускается для определенной группы пользователей (с моим именем), запрос, кажется, работает отлично, но при запуске его для случайного выбора пользователей он не выполняется.

Для целей моеготестируя, я передаю точные значения конкретного пользователя, так что я бы ожидал хотя бы 1 совпадение.

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

Для экземпляра этот запрос возвращает ожидаемую запись пользователя:

{
    "from": 0,
    "size": 1,
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "firstName": {
                            "query": "sVxGBCkPYZ",
                            "boost": 30
                        }
                    }
                }
            ],
            "should": [

            ]
        }
    },
    "fields": [
        "id",
        "firstName"
    ]
}

Однако замена элемента match на приведенное ниже не дает никаких записей:

{
    "fuzzy": {
        "firstName": {
            "value": "sVxGBCkPYZ",
            "fuzziness": 2,
            "boost": 30,
            "min_similarity": 0.3
        }
    }
}

Почему это происходит, и могу ли я что-нибудь сделать, чтобы исправить ситуацию?

Для справки.Это версия ES, которую я сейчас использую:

"version": {
    "number": "1.7.1",
    "build_hash": "b88f43fc40b0bcd7f173a1f9ee2e97816de80b19",
    "build_timestamp": "2015-07-29T09:54:16Z",
    "build_snapshot": false,
    "lucene_version": "4.10.4"
}

1 Ответ

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

Совпадение не удается, потому что fuzzy searches равны term level queries, что означает, что строка запроса не будет проанализирована , в то время как данные, которые были проиндексированы, я предполагаю, если тип text с standard analyzer, будетпреобразовать в svxgbckpyz в инвертированном индексе.

Вместо этого можно реализовать fuzziness с помощью запроса match, как показано ниже:

POST testindex/_search
{  
   "query":{  
      "match":{  
         "firstname":{  
            "query":"sVxGBCkPYZ",
            "fuzziness":"AUTO"
         }
      }
   }
}

Вы можете изменить значение с AUTO на 2 или 3 в зависимости отваш вариант использования.

Упомянутое вами совпадение exact также работает, потому что строка запроса будет проанализирована и преобразует входную строку в нижний регистр, который доступен в инвертированном индексе.

Что касается того, как нечеткий запрос (который вы упомянули) работает за сценой, в соответствии с этим LINK , выглядит следующим образом:

Нечеткий запросработает, беря оригинальный термин и создавая автомат Левенштейна - как большой граф, представляющий все строки, которые находятся в пределах указанного расстояния редактирования исходной строки.

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

Конечно, в зависимости от типа данных, хранящихся в индексе, нечеткий запрос срасстояние редактирования 2 может соответствовать очень большому числу терминов и работать очень плохо.

Обратите особое внимание на это утверждение: representing all the strings that are within the specified edit distance of the original string

Например, для некоторых слов с расстоянием1 для life будет aife, bife, cife, dife....lifz.

Так что в вашем случае автомат нечеткого поиска не сможет создать термин svxgbckpyz из входной строки sVxGBCkPYZ во-первых, потому что расстояние между ними равно 7 (Помните, что расстояние между 1 A и a) равно 1, что, я не думаю, может создать опция AUTO, и даже если вы настроите ее на 7, она может не создавать строку, поскольку будет огромный список словс расстоянием 7

Добавление еще одного LINK для получения дополнительной информации.Надеюсь, поможет!

...