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

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

    Недавно мы рассказывали, что аналитика больших данных с помощью технологий 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/
    2. https://habr.com/ru/post/280488/
    3. https://coderlessons.com/tutorials/bolshie-dannye-i-analitika/vyuchit-kibanu/kibana-rabota-s-kholstom