Обычный пользователь должен чувствовать, что поиск на сайте — это просто. Он привык к интеллектуальным возможностям поиска в Google и Яндексе, и от любой другой поисковой строки по умолчанию ожидает того же. Набираешь, например, «телискп» или «пороцитомол» и получаешь список оптических приборов и фармпрепаратов с указанием разделов каталога в котором они находятся.

Как поисковая система сайта понимает что пользователь имел в виду на самом деле? Магия или наука? Попробуем разобраться чем грозит бизнесу недостаточное внимание к внутреннему поиску, как он помогает сократить путь пользователя и улучшить конверсию.

Влияние поисковой строки на конверсию

Поисковая строка на сайте — это часть вашей воронки продаж.

Нулевая выдача на запрос = потеря клиента. Если пользователь не нашел то, что искал, — вы ему это не продадите.

Цитата1.png

Клиенты, которые пользуются поиском по сайту, могут приносить коммерческому интернет-ресурсу до 50% дохода.

Сравним две аудитории интернет-магазина: одна из них пользуется внутренним поиском, другая — нет. Доля аудитории, которая пользуется внутренним поиском, составляет 12%. Но именно она приносит интернет-магазину 43% дохода.

Dolya dohoda auditorii poiska v internet-magazine.png

Базовый минимум для современного «умного» поиска.

Карточка 2.png

Справится ли Битрикс с такой задачей? По умолчанию — нет.

Как работает встроенный поиск Битрикса

Стандартный поисковый модуль в «1С-Битрикс: Управление сайтом» хорошо решает свои задачи, когда нужно просто что-то найти без сложного контекста и условий. Используя точную семантику запроса он ищет по всему тексту, заголовкам, полям и тегам в различных разделах сайта (каталог, новости, база знаний, блог, о компании и пр). Такой полнотекстовый поиск вполне подходит, если на сайте представлен небольшой ассортимент, не требуется фильтрация, не нужно включать в выдачу промо-позиции и совершать какие-либо сложные конверсионные действия.

Однако, если нужно администрировать товарный агрегатор или интернет-магазин с большим каталогом, то придется докрутить поиск. Например, ограничить его только инфоблоками с товарами и SKU, чтобы, помимо них, Битрикс не выдал сборную солянку из ленты новостей, статей и «полезной» информации со служебных страниц. В таком случае клиенту удобнее и проще вернуться к выдаче Яндекса, чем продолжать тратить время на вашем сайте.

Карточка 3.png

Почему так получается?

Сначала штатный поиск Битрикса делит предложение на части и отбрасывает предлоги, союзы, частицы. Дальше приводит все слова в начальную форму и сохраняет их в таблицах базы данных. В одной таблице сохраняются все начальные формы слов, в другой — все тексты, третья связывает конкретное слово с конкретными текстами. N-граммы не строятся, поэтому Битрикс не умеет исправлять ошибки и искать по части слова или артикула, но умеет различать окончания слов. Для этого у него есть специальная настройка — учитывать/ не учитывать морфологию. Если она учитывается, поиск идет по словоформам, если нет — по точному вхождению.

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

Есть и другие нюансы, способные плохо влиять на конверсию сайта с поиском по умолчанию. Так, на запрос с орфографической ошибкой или неверной цифрой в коде товара ответ будет нулевым, как и конверсия из поиска в переход к товарной карточке.

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

Как забустить поиск Битрикса

C версии 14.0.0. в продуктах «1С-Битрикс» доступна поддержка системы полнотекстового поиска Sphinx. Она позволяет искать быстрее и лучше, снижает нагрузку на сервер, а также полностью интегрирована с компонентами модуля «Поиск». К сожалению, актуальная версия 3.х.х ядром Битрикса еще поддерживается.

Из плюсов Sphinx:

  • высокая масштабируемость, скорость индексации и поиска;

  • наличие трех встроенных (ru, en, cs) и 12 подключаемых морфологических плагинов лемматизации (приведение слова к словарной форме) и стемминга (нахождение основы слова для заданного исходного слова);

  • full-text, фасетный, geo поиск и индексация;

  • поддержка стоп-слов, на случай, если нужно убрать некоторые слова из поисковой выдачи;

  • распределенный поиск на нескольких нодах (запущенных экземплярах Sphinx) в кластере;

  • готовые интеграции для различных платформ и фреймворков;

  • умеренное использование серверной памяти.

Минусы:

  • ограниченный API и отсутствие дефолтного нечеткого (fuzzy) поиска;

  • необходимость ручной настройки структуры индексов, что усложняет масштабирование;

  • снижение производительности при увеличении объемов данных;

  • нет возможности визуализации;

  • маленькое сообщество.

Быстрая индексация делает Sphinx идеальным для проектов с низкими требованиями к поисковым функциям. Но что делать, если проект вырос, вы хотите масштабироваться или вам требуется гибкое управление поисковой выдачей?

Переводим поиск на Elasticsearch

Обычно про него заходит речь когда текущая поисковая система сайта чем-то не устраивает. В связке с другими продуктами разработчика (т.н. Elastic Stack, ELK) этот инструмент предоставляет ещё больше возможностей в управлении поиском и представлении данных.

Elasticsearch (ES) — это нереляционное хранилище документов с собственным REST API, работающее с данными в формате JSON.

Рейтинг поисковых систем.png

Elasticsearch — постоянный лидер рейтинга DB-Engines.

Отличий Elasticsearch от Sphinx много. Вот самые важные.

  • Масштабируемость. Как и Sphinx, ES предлагает высокую степень горизонтальной масштабируемости, позволяя распределять и реплицировать данные на множество узлов и шардов. Но Sphinx требует ручного управления структурой индексов, а Elasticsearch позволяет «на лету» добавлять новые узлы к уже имеющейся системе и автоматически распределять на них нагрузку.

  • Возможности API. ES поддерживает широкий спектр сложных запросов и мощные функции агрегации и фильтрации для анализа данных, может отдавать их напрямую из поискового движка. У Sphinx API победнее, что заставляет постоянно дергать её БД запросами.

  • Структура данных. ES лучше работает с мультиязычными системами и неструктурированными данными, а Sphinx быстрее индексирует структурированные базы: форумы, интернет-магазины, чаты, каталоги. Для мультиязычных систем, в  случае Sphinx, придется построить отдельные индексы по разным языкам, отдельно настраивать морфологию, стемминг, параметры нечеткого поиска. Elasticsearch, напротив, проанализирует и зальет данные в отдельный индекс, настроит параметры под нужный язык. Данные будут изолированы, а поиск станет работать быстрее. Эффективная работа с неструктурированными данными позволяет успешно применять ES в рекомендательных системах.

  • Отказоустойчивость. Sphinx не поддерживает автоматическое управление репликацией и шардированием, что делает его менее устойчивым к сбоям по сравнению с Elasticsearch, повышает нагрузку на администраторов системы.

  • Хранение и анализ логов, визуализация данных. Сегодня это почти must-have любого интернет-проекта, но представлять данные в удобном для анализа виде умеет только экосистема ELK. Она может обрабатывать гигабайты данных от балансировщиков, гипервизоров и коммутаторов и представлять их в виде удобных дашбордов. Помимо этого Elasticsearch использует возможности машинного обучения (ML) для улучшения анализа данных и поиска.

Elasticsearch для поиска

Для организации и хранения данных Elasticsearch использует индексы. Индекс — это логическое хранилище, в котором организованы документы одного типа. Каждый индекс состоит из одного или нескольких шардов (частей), что позволяет распределять данные по различным узлам кластера для обеспечения отказоустойчивости и масштабируемости.

Чтобы данные попали в индексы ES их нельзя просто взять и затянуть из базы данных сайта «как есть». Эти «сырые» данные нужно проиндексировать. Для создания индекса используют собственный API системы, который нужно откуда-то вызывать. Это могут делать обработчики событий в Битриксе или агент, который будет периодически обновлять данные, или сервер очередей. Очень удобно работать с Kibana из стека ELK.

Ниже представлен пример индекса с ручным маппингом полей. Индекс можно создать с помощью REST API или готовой библиотеки для работы с ним. Маппинг может быть и динамический, но обычно этой штуке нельзя полностью доверять. Лучший результат получается при комбинации динамического и явного маппинга, можно создавать свои хитрые правила сопоставления полей.

Пример индекса Elasticsearch.png

Загружаем в индекс товары.

Загрузка товаров и индекс.png

Получаем товары в индексе.

Пробуем найти «Туфли».

В выдаче получаем «Платье Красная Фея», т.к. «туфли» могут быть не только в названии искомого товара, но и в описании других товаров.

В этом случае можно скорректировать запрос и искать только в названии, но…

… мы еще не видели магазина, где нужен был бы поиск только по названию товара, а не по описанию, значению свойств и тд.

Можно пойти по другому пути и расставить приоритеты (веса) полей.

Это позволяет гибче управлять ранжированием в зависимости от того, в каком поле нашлись совпадения.

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

Сравнение анализаторов.png

Не всегда удается получить от стандартных анализаторов то, что нужно. В таком случае можно сделать свой, доработав один из его элементов — токенайзер. Есть несколько доступных токенайзеров, например, N-gram tokenizer или Edge-ngram tokenizer. Последний обычно используется для анализа запросов по мере ввода.

Токенайзер.png

Пробуем искать еще раз.

Elasticsearch нашел «вечер» в различных словоформах из разных категорий каталога. То что нужно!

Как хранить каталог в Elasticsearch

Все зависит от структуры и данных, по которым нужно искать.

  1. Один индекс с товарами — если нет SKU (или есть, но в выборке для каталога не участвуют).

  2. Индекс с товарами без SKU.png

  3. Один индекс с SKU и информацией о товарах.

  4. Индекс с SKU и информацией о товарах.png

  5. Индекс с товарами + индекс с SKU и Parent-Child Relationship. Вложенные сущности делать можно, но на большом объеме данных и при большом количестве запросов (нагруженный интернет-магазин) это будет работать очень медленно.

  6. Индекс с товарами + индекс с SKU.png

  7. Всё храним в одном индексе — Nested objects. Здесь есть ограничение в 1000 уникальных свойств на индекс, но за него можно будет выйти, если у нас действительно много свойств у товаров. И это, конечно, скажется на производительности.

Все в одном индексе.png

Как создать «умный» фильтр

Такой фильтр реализуется за счет механизма агрегаций и уже в нем можно получить нужные данные, без отдельного запроса к БД. Правда из-за этого запрос в ES становится примерно на 10% медленнее.

В mapping для текстовых полей добавляем raw с типом <keyword>.

УФ1.png

В поисковый запрос добавляем узел aggs.

УФ2.png

В ответе на запрос появится новый узел, где будет вся нужная нам информация.

Для свойства «Артикул».

УФ3.png

Для свойства «Производитель»

УФ4.png

Elasticsearch для управления логами

ES прекрасно подходит не только для поиска, но и для сбора/хранения логов. Комбинируя систему с Logstash и Kibana, можно создать мощную систему их обработки. Не обязательно использовать Logstash, вполне достаточно FluentBit, Filebeat, Vector или отправки логов напрямую из приложения через API ES. Если логов очень много, можно перед парсером поставить брокер сообщений.

Ограничения

  • В ES не стоит хранить критически важные данные (заказы, оплаты, заявки и т.д.). Лучше использовать как витрину данных, которых много и из реляционной СУБД они выбираются долго.

  • Нет разграничения по правам на уровне приложения. В Elasticsearch есть пользователи и им можно разграничить права на отдельные индексы и операции в них (создание индексов, добавление записей в индекс, чтение из определенных индексов). Но сделать разграничение прав как в приложении (интернет-магазин, портал и т.д.) силами ES не получится. Ролевая модель на уровне приложения может быть очень сложной и не всегда можно (и нужно) повторить такую же на уровне базы данных (чем и является по сути ES). Можно базово создать что-то своё, но сложные ролевые модели вряд ли получится сделать нормально. 

  • Из-за отсутствия «нормальных» связей придется делать промежуточные индексы с денормализованными данными.

  • Нет транзакций как в реляционной СУБД, что может привести к неконсистентным и несогласованным данным в индексах. Если нужно обеспечить выполнение требований ACID — придется реализовывать их на уровне вашего приложения.

Стоимость

ELK представлен в cloud и self-hosted версии и четырьмя типами лицензий. Есть Open Source — бесплатная версия с открытым исходным кодом и Basic — бесплатная версия с некоторыми дополнительными возможностями, но без открытого кода. Для большей части проектов ее достаточно.

Enterprise-лицензии стоят как чугунный мост, несколько тысяч у.е. за ноду. А их нужно минимум три штуки. Плюс проблемы с оплатой из России.

Но решение, как всегда, у нас есть.

Альтернативы

Можно попробовать Open-source платформы:

  • Solr — популярная поисковая система. Как и ES основана на Lucene.

  • OpenSearch — тоже популярная альтернатива. Есть даже managed-решение от ЯндексОблака.

  • ZincSearch — написанный на GO поисковый движок с ES-совместимым API. Позиционируется как более эффективный по потреблению ресурсов.

  • OpenObserve — от авторов ZincSearch, но написан на Rust и только для работы с логами.

Еще одно удобное решение, которое мы интегрировали в онлайн ритейле, — сервис  Anyquery. Это внешняя поисковая система с интегрированным AI, диалоговыми подсказками и собственными правилами мерчандайзинга. Умеет многое. Для старта нужен только каталог в формате YML.

Хороший поиск не может быть простым. В него нужно инвестировать, тем более что сегодня существует достаточно платформ под разные бизнес-запросы и бюджеты.

Одни, как Sphinx, подходят для проектов с высокими требованиями к скорости индексации и простоте интеграции, могут обеспечить быстрый поиск при ограниченных ресурсах. Другие, как Elasticsearch, предлагает более мощные функции поиска, гибкость в работе с данными и высокую масштабируемость, что делает их более подходящими для проектов с большими объемами неструктурированных данных.

Если вашему сайту нужно нарастить конверсию, особенно среди посетителей использующих внутренний поиск, стоит задуматься о возможностях его поисковой системы. Вероятно ей требуется модернизация. Мы готовы помочь с выбором и настройкой под ваши особенности, сегменты и тематику. Заполните форму внизу, мы перезвоним и обсудим задачу подробнее.

Оцените статью
31.10.2024
Понравилась статья?
Поделитесь ссылкой с друзьями и коллегами!

Статьи по теме

Выжимаем максимум скорости из PHPКогда дело доходит до запуска PHP-приложений, выбор подходящего веб-сервера критически важен. Цель статьи — помочь в выборе оптимального решения для своих проек...
Доработка системы LMS KnomaryMust have для бизнеса, где главный актив это люди, — стратегия обучения и развития персонала. Рассказываем как помогли доработать LMS-систему для компании ЕВРАЗ...
«Как раньше» больше не работает — B2B-система продаж сейчасВ этой статье хотим поговорить с чем сейчас сталкивается оптовый бизнес (множеством вызовов и изменений, которые требуют адаптации, а также оптимизации процессо...
Интеграция B2B-платформы на Битрикс с системой авторизации KeycloakВ период бурного роста компании менеджмент учетных записей сотрудников и клиентов может стать проблемой. Решение — интеграция с брокером авторизаций Keycloak ил...
Разработка календаря бронирования для сайта на Битрикс авиационного учебного центраЧтобы пилоты авиакомпаний могли бронировать время своих тренировок в учебном центре, мы разработали для них удобный модуль бронирования времени. Рассказываем по...
Мы работаем по одному из двух форматов:
  • аренда команды (от 2 человек, не менее 3 месяцев);
  • итерации с фиксированной ценой (1-3 месяца длительностью).
ИНТЕРВОЛГА предоставляет:
  • регулярные онлайн-планерки с заказчиком;
  • квалифицированных специалистов;
  • организованную команду (находятся в одном помещении, что упрощает решение рабочих вопросов);
  • полную прозрачность и регулярность отчетов о результатах.
Ключевые услуги:
  • нагруженный интернет-магазин;
  • личный кабинет;
  • оптовые продажи — B2B-платформа;
  • маркетплейс;
  • технический аудит сайта;
  • Битрикс24 — корпоративные HR-порталы;
  • Битрикс24 — построение CRM-системы;
  • Битрикс24 — личные кабинеты сотрудников;
  • Битрикс24 — аудит портала;
  • 1С — интеграция с другими системами;
  • 1С — доработка системы;
  • маркетинг — комплексное интернет-продвижение;
  • маркетинг — продвижение для B2B.
Хотите получать лучшие статьи от INTERVOLGA раз в месяц?
Подпишитесь на рассылку — спамить не будем