Используя Elasticsearch 5, у нас было поле, такое как номер водительского удостоверения, где значения могут включать специальные символы и непоследовательное поведение в верхнем / нижнем регистре, поскольку значения вводились пользователями с ограниченной проверкой. Например, это гипотетические значения:
- CA-123-456-789
- WI.12345.6789
- tx123456789
- аз-123-хуг-456
- …
В нашем приложении конечный пользователь должен искать по этому полю. У нас было деловое требование, чтобы у пользователя не было возможности вводить какие-либо специальные символы, такие как дефисы и точки, чтобы получить запись. Таким образом, для первого примера, приведенного выше, пользователь должен иметь возможность ввести любое из этих значений и увидеть эту запись:
- CA-123-456-789 (точное совпадение)
- CA123456789 (без специальных символов)
- ca123456789 (строчные буквы и без специальных символов)
- Ca.123.456-789 (смешанные буквы и смешанные специальные символы)
Наш подход состоял в том, чтобы написать собственный анализатор, который игнорирует специальные символы, а затем выполнить запрос к этому полю.
Шаг 1: Создать шаблон, заменить символьный фильтр и пользовательский анализатор
Мы определили шаблон замены символов в шаблоне для удаления любых не алфавитно-цифровых символов в индексе следующим образом:
1
2
3
4
5
6
7
|
"char_filter" : { "specialCharactersFilter" : { "pattern" : "[^A-Za-z0-9]" , "type" : "pattern_replace" , "replacement" : "" } } |
Затем мы использовали этот фильтр для создания собственного анализатора, который мы назвали «alphanumericStringAnalyzer» в индексе:
01
02
03
04
05
06
07
08
09
10
|
"analyzer" : { "alphanumericStringAnalyzer" : { "filter" : "lowercase" , "char_filter" : [ "specialCharactersFilter" ], "type" : "custom" , "tokenizer" : "standard" } } |
Шаг 2: Определите сопоставление полей с помощью пользовательского анализатора
Следующим шагом было определение нового отображения поля, в котором использовался новый анализатор «alphanumericStringAnalyzer»:
01
02
03
04
05
06
07
08
09
10
11
12
|
"driversLicenseNumber" : { "type" : "text" , "fields" : { "alphanumeric" : { "type" : "text" , "analyzer" : "alphanumericStringAnalyzer" }, "raw" : { "type" : "keyword" } } } |
Шаг 3: Запустить запрос к новому полю
В нашем случае мы имеем этот запрос на совпадение как часть логического запроса в предложении «should»:
1
2
3
4
5
6
7
8
9
|
{ "match" : { "driversLicenseNumber.alphanumeric" : { "query" : "Ca.123.456-789" , "operator" : "OR" , "boost" : 10.0 } } } |
Опубликовано на Java Code Geeks с разрешения Стивена Уолла, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Elasticsearch — игнорировать специальные символы в запросе с шаблоном замены шаблона и пользовательским анализатором
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |