Практический пример монетизации Big Data с помощью Elasticsearch и Kibana

цифровизация, цифровая трансформация, Big Data, Большие данные, предиктивная аналитика, цифровая экономика, Elasticsearch, NoSQL, ритейл

Недавно мы рассказывали, что аналитика больших данных с помощью технологий Big Data – это необязательно удел только крупных корпораций. В этой статье мы рассмотрим реальный бизнес-кейс, как извлечь выгоду из накопленных данных о своих пользователях, применяя для этого возможности NoSQL-СУБД Elasticsearch для полнотекстового поиска по полуструктурированным данным и веб-интерфейс визуализации результатов Kibana.

Постановка задачи с точки зрения бизнеса

Рассмотрим кейс небольшого интернет-магазина зоотоваров, где есть партия кормов для кошек и собак, у которой через несколько месяцев истекает срок годности. Чтобы оперативно реализовать его в пределах этого срока, компания решила объявить распродажу, сообщив об этом своим покупателям, общая база которых насчитывает около миллиона клиентов. Однако, корма для кошек и собак будут интересны только владельцам этих животных, а не, например, хозяевам рептилий или птиц. Поэтому нужно из всей базы клиентов выбрать именно тех, кто попадает в нужную категорию. Далее этим пользователям будет отправлена адресная email-рассылка с описанием акции и персональным маркетинговым предложением.

Выявить искомую категорию клиентов можно, проанализировав покупки пользователей. К примеру, если человек приобрел ошейник, поводок, шлейку, шампунь от блох, корм или игрушку для собаки/кота, то с большой вероятностью он является владельцем этого животного и входит в целевую аудиторию данного маркетингового кейса.

Пусть данные о пользовательских покупках хранятся в формате JSON и выглядят следующим образом:

{ 

«orderID»: 12345,

«transaction_date»: «20.06.20»,

«transaction_time»: «14.40», 

«clientName»: «Иван Иванов «, 

«clientEmail»: «ivanov@example.com»,  

«contents»: [   

{     

«productID»: 34,     

«productName»: «Клетка для птиц«,     

«quantity»: 1   

},   

{      «productID»: 56,     

«productName»: «Корм для птиц сухой«,     

«quantity«: 3   

} 

], 

«orderCompleted»: true

}

Полнотекстовый поиск по названию товара (productName) позволит выявить клиентов, приобретавших нужную продукцию, а данные об имени покупателя (clientName) и его email-адресе (clientEmail) помогут сформировать персональное письмо с маркетинговым предложением. Далее рассмотрим, как получить эту информацию с помощью Elasticsearch.

 

Как найти иголку в стоге сена: примеры полнотекстового поиска в Elasticsearch

В Elasticsearch существует два контекста, в которых работает поиск [1]:

  • Query, который работает как полнотекстовый поиск и позволяет находить похожие на запрашиваемые значения в больших объемах текста. Благодаря анализаторам query-запросы позволяют искать по словоформам (так называемый «нечеткий поиск»), исключать стоп-слова и пр. При выполнении query-запросов для каждого документа вычисляется рейтинг – численное значение того, насколько документ подходит под запрос. Результаты в выдаче сортируются в порядке убывания этого рейтинга.
  • Filter, который позволяет выполнять поиск по точному значению для фильтрации документов. Filter-запросы кешируются и отрабатывают быстрее, чем query-запросы.

Примечательно, что полнотекстовый поиск позволяет находить документы не по точному совпадению значений определенных полей с заданным в запросе, а именно по текстовому содержимому всех полей. В рассматриваемом кейсе интернет-магазина это особенно важно, т.к. в названии товаров могут встречаться опечатки, например, «корушка» вместо «кормушка» и т.д.

В Elasticsearch полнотекстовый поиск основан на инвертированном индексе — структуре данных, которая содержит все слова из датасета и списки с документами, где встречаются эти слова – термы, что выдает анализатор после обработки входного текста. При полнотекстовом поиске движок ES обращается только к инвертированному индексу, поэтому не получится найти точное совпадение фразы без использования анализаторов по строкам целиком. Поэтому еще на этапе создания маппинга (схемы) индекса следует предусмотреть назначение рассматриваемых полей. В частности, числа или даты индексировать без анализаторов, а для текстовых полей, которые не являются перечислением небольшого набора значений, стоит тщательно выбирать метод анализ, который напрямую влияет на результаты поиска [1]. Проводя аналогию с реляционными СУБД, можно сказать, что индекс — это база данных, а тип — это отдельная таблица в ней. Каждый тип имеет свою схему (маппинг, mapping), который генерируется автоматически при индексации документа [2]. Тем не менее, при формировании поисковых запросов к Elasticsearch индекс не является обязательным параметром, но он ускоряет поиск. При отсутствии указания конкретного индекса поиск будет осуществлять по всем данным, что есть в базе, а это долго.

Возвращаясь к рассматриваемому примеру, посмотрим, как будет выглядеть запрос к Elasticsearch, которой вернет список имен и емейлов именно тех клиентов, кто покупал товары для кошек и собак. Зададим все возможные словоформы: «кошк» (для слов «кошка», «кошки», «кошек»), «кот» (для слов «кот», «кота», коты), аналогично «собак», «пс» («пса», «псов», «псы»), «пес», «пёс»).

POST index_usecase/_search

{  

«_source»: [

     «clientEmail«,

     «clientName»  

],  

«query»: { 

    «terms»: {

       «productName» : [«кот«,»кош«, «пс«, «пес«, «пёс«]    

}

   }

}

Избежать ручного перечисления возможных словоформ позволят специальные морфологические плагины, которые приводят близкие слова к одному и тому же токену, например, «люди/человек», «пес/собака» и пр. В частности, для русского языка это плагин russian_morphology [2].

Параметр fuzziness позволит найти слова с опечатками, задав число возможных несовпадающих символов в терме [1].

{

    «query»: {

        «match»: {

            «question»: {

                «query»: «fulltext search»,

                «fuzziness»: 1,

            }

        }

    }

}

Результаты поиска отобразятся в виде таблицы в веб-интерфейсе Kibana, которые можно экспортировать как CSV-файл, чтобы затем загрузить его в сервис почтовых рассылок для отправки персонального маркетингового предложения. А наличие функции геопоиска позволит сделать рекламу еще более персональной, например, включив в письмо упоминание о местонахождении близких к клиенту пунктов выдачи товаров.

В заключение отметим еще одну возможность Kibana, особенно полезную с точки зрения прикладной аналитики больших данных – панель Холст (Canvas), которая позволяет формировать собственные дэшборды подобно интерактивным панелям BI-систем. Такие отчеты помогают руководителям, а также аналитикам, маркетологам и другим специалистам получить полную картину по прошлым периодам и выявить текущие тренды [3]. Главное, при таком глубоком анализе этом не нарушить приватность частных лиц, о чем мы рассказываем здесь.

Kibana, Elasticsearch, аналитика больших данных
Пример дэшборда в Kibana, созданного с помощью инструментов вкладки Canvas

Как еще использовать возможности ELK-стека и других технологий Big Data в реальных проектах цифровизации вашего бизнеса или цифровой трансформации государственных и муниципальных предприятий, вы узнаете на нашем обновленным курсе «Аналитика больших данных для руководителей» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

 

Источники

  1. https://alexeykalina.github.io/technologies/elasticsearch-fulltextsearch.html
  2. https://habr.com/ru/post/280488/
  3. https://coderlessons.com/tutorials/bolshie-dannye-i-analitika/vyuchit-kibanu/kibana-rabota-s-kholstom
Поиск по сайту