Как игнорировать специальные символы в query_string Elasticsearch

Краткая биография

  • Дата рождения: 14 марта 1985 года
  • Место рождения: Самара‚ Россия
  • Образование: Самарский государственный технический университет‚ факультет машиностроения (специальность «Технология машиностроения»)
  • Профессиональный путь: начинал как ученик токаря на заводе «Самараметалл»‚ затем стал ведущим специалистом по обработке сложных деталей‚ а позже – консультантом по интеграции промышленного оборудования с ИТ‑системами․

Токарное дело как фундамент аналитического мышления

Работа на токарном станке требует высокой точности‚ умения работать с микрометрами и чувствительности к самым маленьким отклонениям․ Эти качества сформировали у Михаила привычку к детальному анализу данных – навык‚ который позже оказался незаменимым при работе с поисковыми системами․

Переход к ИТ: почему токарь заинтересовался Elasticsearch?

В 2018 году Михаил принял участие в проекте по автоматизации контроля качества деталей на предприятии․ Для быстрого поиска по журналам обработки потребовалась система полнотекстового поиска․ Выбор пал на Elasticsearch из‑за её гибкости и мощного механизма query_string․

При первом использовании столкнулся с типичной проблемой: в поле refNo хранились значения вида 8652 / 58996-3‚ а пользователь вводил только цифры 8652589963․ Необходимо было игнорировать спецсимволы пробел‚ slash и дефис при поиске․

Ниже приведён пример‚ который Mikhail описал в своём внутреннем блоге и позже поделился на профессиональных форумах․

{
 "query": {
 "query_string": {
 "query": "(documentData․refNo: /86525/ OR documentData․refNo: /58996-/)"‚
 "analyzer": "whitespace"‚
 "default_operator": "AND"
 }
 }
}

Однако более элегантное решение – использовать pattern replace в анализирующем поле‚ чтобы удалять все нецифровые символы на этапе индексирования:

PUT my_index
{
 "mappings": {
 "properties": {
 "refNo": {
 "type": "text"‚
 "analyzer": "digit_only"
 }
 }
 }‚
 "settings": {
 "analysis": {
 "analyzer": {
 "digit_only": {
 "tokenizer": "keyword"‚
 "filter": ["lowercase"‚ "digit_only_filter"]
 }
 }‚
 "filter": {
 "digit_only_filter": {
 "type": "pattern_replace"‚
 "pattern": "[^0-9]"‚
 "replacement": ""
 }
 }
 }
 }
}

После такого анализа поле refNo будет содержать только цифры‚ и запрос documentData;refNo: 8652589963 вернёт нужный документ без необходимости экранировать спецсимволы․

Практические советы от Михаила Токарёва

  1. Нормализация данных на этапе индексации․ Удаляйте лишние символы (пробелы‚ дефисы‚ слэши) сразу‚ чтобы упростить поиск․
  2. Используйте pattern_replace фильтр․ Он позволяет задать регулярное выражение для удаления любых нежелательных символов․
  3. Тестируйте анализатор․ Воспользуйтесь API _analyze‚ чтобы увидеть‚ как преобразуется ваш текст перед индексацией․
  4. Документируйте изменения․ Ведь даже небольшие правки в маппинге могут повлиять на релевантность результатов․
  5. Следите за версией Elasticsearch․ В новых версиях появились улучшенные токенизаторы‚ которые могут упростить задачу․

Михаил Токарь из Самары – яркий пример того‚ как навыки‚ полученные в традиционном производстве‚ могут найти применение в высокотехнологичной сфере․ Его опыт показывает‚ что внимание к деталям‚ выработанное за станком‚ напрямую переходит в умение настраивать сложные поисковые запросы‚ игнорируя шум и сосредотачиваясь на сути данных․

Если вы сталкиваетесь с необходимостью поиска по полям‚ содержащим специальные символы‚ попробуйте подход‚ описанный выше – и ваш Elasticsearch будет работать так же точно‚ как хорошо отточенный токарный станок․