Разработка умного поиска с учетом морфологии в BigData решениях
Заказчик – поставщик и арендодатель оборудования для аттракционов. Перед нами была поставлена задача разработки умного поиска по сайту https://www.art-active.ru/. Также требовалось разработать парсинг с сайта по его фиду - потоку контента, который автоматически подгружается блоками на веб-странице или в приложении.
Фид представляет из себя XML-файл, содержащий всю информацию, о товарах, отображающуюся на сайте: наименование, цена, категория и прочее. Эти данные определяют объекты, хранимые в базе данных.
Был реализован поиск с учетом морфологии, добавлена необходимая приоритетность поиска, скорректировано разбиение фразы на токены, переработан поиск по ключевым словам. Токены представляют из себя массив слов из которых состоит запрос. Например, токенизатор пробелов, который используется по стандарту, разделит текст на токены, когда увидит пробел. Текст «Быстрая коричневая лиса!» Преобразуется в [«Быстро», «коричневая», «лиса!»].
В работе использована поисковая система Elasticsearch, которая работает с отдельной базой данных. Elasticsearch предоставляет следующие возможности:
- Автоматическую индексацию новых JSON-объектов, которые загружаются в базу и сразу становятся доступными для поиска, за счет отсутствия схемы согласно типичной NoSQL-концепции. Это позволяет ускорить прототипирование поисковых Big Data решений;
- Гибкость поисковых фильтров, включая нечеткий поиск и мультиарендность, когда в рамках одного объекта ES можно динамически организовать несколько различных поисковых систем;
- Наличие встроенных анализаторов текста позволяет Elasticsearch автоматически выполнять токенизацию, лемматизацию - процесс приведения словоформы к её нормальной (словарной) форме, стемминг - это процесс нахождения основы слова для заданного исходного слова и прочие преобразования для решения NLP-задач, связанных с поиском данных.
Поиск происходит по следующему алгоритму:
- Создается и настраивается запрос, содержащий следующие параметры:
a. type – тип запроса;
b. fields – поля по которым происходит поиск и их приоритетность;
c. query – сам запрос;
d. minimum_should_match – количество знаков на сколько результат может отличаться от запроса. - Запрос подается на вход анализатору.
- Анализатор разбивает запрос на токены, используя фильтры.
- Производится поиск по заданным полям и сортируется в зависимости от заданных настроек запроса.
- Возвращается список результатов.
Поиск, по ключевым словам, реализован с помощью анализатора «keyword», который подразумевает полное вхождение запроса в результат, учитывающий регистр букв, пробелы и специальные знаки.
Учет морфологии подразумевает разбиение запроса по таким частям как предлоги, частицы и др. С помощью морфологии запрос разбивается на токены, представляющие из себя основу слова, например, «отвертка» после работы анализатора будет представлять из себя «отвертк».
В ходе работы на проекте был разработан и настроен парсинг, который сначала обращается к сайту заказчика и получает фид в виде XML. Далее данные добавляются или обновляются в базе данных сервера заказчика для актуального содержания в результатах поиска. Парсинг работает по указанному времени раз в день или при необходимости запускается вручную заказчиком.
Заказчику были предоставлены консультации по тонкостям работы и настройке поиска.
- Технологии:
- JavaScript
- Elasticsearch
- Python
- Django