ElasticSearch - сопоставить запрос с нечеткостью поиска буквенно-цифровой - PullRequest
0 голосов
/ 07 ноября 2018

Использование Match Query с нечеткостью и запрос алфавитно-цифрового термина, и результаты не приходят должным образом.

Пожалуйста, найдите мой запрос ниже, который выполняется в кибане

GET index_name/_search
{
    "query": {
        "match" : {
            "values" : {
                "query" : "A661752110",
                "operator" : "and",
                "fuzziness": 1,
                "boost": 1.0,
                "prefix_length": 0,
                "max_expansions": 100

          }
        }
    }
}

Ожидаю результатов, как показано ниже:

A661752110
A66175211012
A661752110111
A661752110-12
A661752110-111

Но я получаю результаты вроде:

A661752110
A661752111
A661752119

Пожалуйста, найдите мои картографические данные:

PUT index_name
{
    "settings": {
        "analysis": {
            "analyzer": {
                "attr_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "char_filter": [
                        "html_strip"
                    ],
                    "filter": ["lowercase", "asciifolding"]
                }
            }
        }
    },

    "mappings": {
        "doc": {
            "properties": {
                "values": {
                    "type": "text",
                    "analyzer": "attr_analyzer"
                },
                "id":{
                    "type": "text"
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 07 ноября 2018

Нечеткое сопоставление позволяет рассматривать два слова, которые «нечетко» похожи, как если бы они были одним и тем же словом Elasticsearch использует расстояние Дамаро-Левенштейна для измерения сходства двух строк. Расстояние Дамаро-Левенштейна измеряет количество отдельных символов, отредактированных в строке, позволяя четыре вида правок:

  • Замена одного символа другим: _f_ox → _b_ox
  • Вставка нового символа: sic → sic_k_
  • Удаление символа: b_l_ack → back
  • Транспонирование двух соседних символов: _st_ar → _ts_ar

Расстояние редактирования контролируется в поисковом запросе с помощью параметра fuzziness. Вы указали fuzziness из 1, что означает, что Elasticsearch будет возвращать только строки, полученные при выполнении одного редактирования (подстановка, вставка, удаление или транспонирование) в «A661752110».

Слова, которые вы ожидали, но не появлялись, имеют расстояние редактирования, строго превышающее 1. Обратите внимание, что в Elasticsearch максимальное разрешенное значение равно 2.

Некоторые предложения для достижения того, что вы хотите:

  • Если вы хотите, чтобы A661752110-12 и A661752110-111 совпали. Вы можете использовать токенизатор, который разбивает текст, когда находит -. Это то, что делает стандартный токенизатор, например.
  • Если вам также нужны A66175211012 и A661752110111, лучшим выбором будет использование запроса регулярного выражения, подобного этому

{ "query": { "regexp": { "values": { "value": "A661752110.{,3}" } } } }

...