Top.Mail.Ru

Разработка умного поиска с учетом морфологии в BigData решениях

Заказчик – пос­тавщик и арен­до­датель обо­рудо­вания для ат­трак­ци­онов. Перед нами была пос­тавле­на задача раз­ра­бот­ки умного поиска по сайту https://www.art-active.ru/. Также тре­бова­лось раз­ра­ботать парсинг с сайта по его фиду - потоку контента, который ав­то­мати­чес­ки под­гру­жа­ет­ся блоками на веб-странице или в при­ложе­нии.

Фид пред­став­ля­ет из себя XML-файл, со­дер­жа­щий всю ин­форма­цию, о товарах, отоб­ра­жа­ющу­юся на сайте: на­име­нова­ние, цена, ка­тего­рия и прочее. Эти данные оп­ре­деля­ют объекты, хранимые в базе данных.

Был ре­али­зован поиск с учетом мор­фо­логии, до­бав­ле­на не­об­хо­димая при­ори­тет­ность поиска, скор­ректи­рова­но раз­би­ение фразы на токены, пе­рера­ботан поиск по ключевым словам. Токены пред­став­ля­ют из себя массив слов из которых состоит запрос. Например, то­кени­затор пробелов, который ис­поль­зу­ет­ся по стан­дарту, разделит текст на токены, когда увидит пробел. Текст «Быстрая ко­рич­не­вая лиса!» Пре­об­ра­зу­ет­ся в [«Быстро», «ко­рич­не­вая», «лиса!»].

В работе ис­поль­зо­вана по­ис­ко­вая система Elasticsearch, которая работает с от­дель­ной базой данных. Elasticsearch пре­дос­тавля­ет сле­ду­ющие воз­можнос­ти:

  • Авто­мати­чес­кую ин­декса­цию новых JSON-объектов, которые заг­ру­жа­ют­ся в базу и сразу ста­новят­ся дос­тупны­ми для поиска, за счет от­сутс­твия схемы согласно типичной NoSQL-кон­цепции. Это поз­во­ля­ет ускорить про­тоти­пиро­вание по­ис­ко­вых Big Data решений;
  • Гибкость по­ис­ко­вых фильтров, включая нечеткий поиск и муль­ти­арен­дность, когда в рамках одного объекта ES можно ди­нами­чес­ки ор­га­низо­вать нес­коль­ко раз­личных по­ис­ко­вых систем;
  • Наличие встро­ен­ных ана­лиза­торов текста поз­во­ля­ет Elasticsearch ав­то­мати­чес­ки вы­пол­нять то­кени­зацию, лем­ма­тиза­цию - процесс при­веде­ния сло­вофор­мы к её нор­маль­ной (сло­вар­ной) форме, стемминг - это процесс на­хож­де­ния основы слова для за­дан­но­го ис­ходно­го слова и прочие пре­об­ра­зова­ния для решения NLP-задач, свя­зан­ных с поиском данных.

Поиск про­ис­хо­дит по сле­ду­юще­му ал­го­рит­му:

  1. Соз­да­ет­ся и нас­тра­ива­ет­ся запрос, со­дер­жа­щий сле­ду­ющие па­рамет­ры:
    a. type – тип запроса;
    b. fields – поля по которым про­ис­хо­дит поиск и их при­ори­тет­ность;
    c. query – сам запрос;
    d. minimum_should_match – ко­личес­тво знаков на сколько ре­зуль­тат может от­ли­чать­ся от запроса.
  2. Запрос подается на вход ана­лиза­тору.
  3. Ана­лиза­тор раз­би­ва­ет запрос на токены, ис­поль­зуя фильтры.
  4. Про­из­во­дит­ся поиск по заданным полям и сор­ти­ру­ет­ся в за­виси­мос­ти от заданных настроек запроса.
  5. Воз­вра­ща­ет­ся список ре­зуль­татов.

Поиск, по ключевым словам, ре­али­зован с помощью ана­лиза­тора «keyword», который под­ра­зуме­ва­ет полное вхож­де­ние запроса в ре­зуль­тат, учи­тыва­ющий регистр букв, пробелы и спе­ци­аль­ные знаки.

Учет мор­фо­логии под­ра­зуме­ва­ет раз­би­ение запроса по таким частям как предлоги, частицы и др. С помощью мор­фо­логии запрос раз­би­ва­ется на токены, пред­став­ля­ющие из себя основу слова, например, «отвертка» после работы ана­лиза­тора будет пред­став­лять из себя «отвертк».

В ходе работы на проекте был раз­ра­ботан и настроен парсинг, который сначала об­ра­ща­ет­ся к сайту за­каз­чи­ка и получает фид в виде XML. Далее данные до­бав­ля­ют­ся или об­новля­ют­ся в базе данных сервера за­каз­чи­ка для ак­ту­аль­но­го со­дер­жа­ния в ре­зуль­татах поиска. Парсинг работает по ука­зан­но­му времени раз в день или при не­об­хо­димос­ти за­пус­ка­ет­ся вручную за­каз­чи­ком.

Заказ­чи­ку были пре­дос­тавле­ны кон­суль­та­ции по тон­костям работы и нас­трой­ке поиска.

  • Технологии:
  • JavaScript
  • Elasticsearch
  • Python
  • Django