Недавно мы рассказывали, что аналитика больших данных с помощью технологий 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]. Главное, при таком глубоком анализе этом не нарушить приватность частных лиц, о чем мы рассказываем здесь.
Как еще использовать возможности ELK-стека и других технологий Big Data в реальных проектах цифровизации вашего бизнеса или цифровой трансформации государственных и муниципальных предприятий, вы узнаете на нашем обновленным курсе «Аналитика больших данных для руководителей» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.
Источники