Интеграция поисковой машины Яндекса с сайтом. Красивый дизайн, мощные алгоритмы и немного багов

За 3 месяца сразу 2 клиента ИНТЕРВОЛГИ (Интернет-магазины разной тематики) обратились с просьбой “улучшить поиск”.

Первый — интернет-магазин фоторамок, второй — онлайн-аптека. 

Бизнес разный, но потребность простая и универсальная: повысить релевантность поиска. Посетители сайта путались в сложных названиях и артикулах товаров и стандартный поиск Битрикса (даже с помощью движка sphinx) просто не справлялся с таким количеством опечаток и недослышок (особенно сильных в фарма-отрасли).

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

Зачем изобретать свой дорогостоящий велосипед, если решение на рынке уже есть? Пусть поиском подходящего товара по запросу “цэтромонь” займется сервис, который на этом собаку съел: Яндекс. А если подход себя оправдает и захочется чего-то более продвинутого, можно будет посмотреть в сторону коммерческих поисковиков: AnyQuery, Multisearch или поисковых движков типа Elasticsearch.

В этой статье рассмотрим, как установить поиск Яндекс на сайт, какие могут быть сложности и какие дополнительные настройки могут понадобиться.

Как это работает

Бесплатный сервис Яндекса “Поиск для интернет-магазинов” устроен так:

  1. Каждый день робот Яндекса заходит на сайт интернет-магазина и скачивает оттуда YML-файл с перечнем актуальных товаров. Это тот же самый YML-фид, нужный для Яндекс-маркета и прочих сервисов Яндекса.

  2. Получив перечень, Яндекс строит по своим алгоритмам поисковый индекс.

  3. Дальше развилка

    1. Вариант А. Яндекс дает код для вставки на сайт. Страница поиска с подсказками в итоге выглядит как “окно в Яндекс” — в бело-желтых тонах.

    2. Вариант Б. Интеграция с сервисом Яндекса и выдача его результатов поиска и подсказок как своих. В своем дизайне и своем виде. Мы выбрали именно такой вариант

Что сделала ИНТЕРВОЛГА

Мы создали свой YML-фид. Стандартный генератор фидов из коробки нам не подходил, логика была нестандартная.

Но беда пришла откуда не ждали. Сервис бесплатный и у него статус “бета-версия” (на момент написания статьи, март 2021). И это не просто так. В сгенерированном YML-файле он обнаружил ошибки… но упорно отказывался уточнять, какие именно. Просто висело сообщение, что формат некорректный. Да, с дружелюбностью к владельцам интернет-магазинов пока что проблемы. 

В разное время помогали 3 странных действия:

  1. Просто перезапустить индексацию YML-файла. Без изменения YML, просто наудачу. Помогало в 10% случаев.

  2. Загрузить товары Яндексу по частям. Если он не “ест” 10 тысяч товаров, сначала отправляли “ложечку за маму” (1000 товаров), потом “ложечку за папу” (уже 2000) и так далее пока он сам не заметит, как успешно обработал все 10 000 товаров. Работа простая, но нудная. После первого успешного парсинга файла целиком проблемы прекращались (!). Помогало в 20% случаев

  3. Написать в ТП Яндекса. Через три дня они отвечали что-то в духе “ой, сейчас исправим” и парсер YML переставал ругаться. С нашей стороны никаких изменений YML-файла не было, что показательно. Срабатывало в остальных 70% случаев.

Конечная цель: такой вид окна Яндекса.

После того как Яндекс согласится, что файл валидный и проиндексирует его, можно проверить логику поиска в личном кабинете Поиска для сайта .

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

Но сжигать за собой мосты и отключать стандартный поиск не стоит. Иногда, даже спустя 2-3 месяца стабильной работы, поиск внезапно ломался. YML-файл ни с того, ни с сего оказывался невалидным. Чтобы это не парализовало работу сайта, добавили простой тест: периодически скриптом искали через Яндекс “нурофен” и еще пару товаров, которые всегда 100% должны быть в наличии. Если Яндекс не отзывался, давал ошибку или пустой результат — считали, что у нас авария и переключались на Битриксовый поиск. А дальше см. алгоритм решения проблем с поиском выше.

Технические детали

Чтобы отправить запрос в Yandex нужно в Кабинете разработчика получить 2 ключа:

  1. ID Яндекс.Поиска

  2. API ключ для Яндекс.Поиска

Ключ бесплатный, в кабинете нет ни слова об ограничениях. Пока что мы используем для всех запросов одного сайта одну пару ID+ключ.

Чтобы получить список товаров по подсказке, нужно вызвать REST-метод, описанный в документации. Документацию найти непросто, вот ссылка на нее.

В ответе возвращаются несколько узлов: товары (documents), разделы каталога (categoryList), исправления (misspell).

Пример товара:

Array
(
    [id] => 4711552
    [name] => Цитрамон П 10 таблетки Ирбит
    [url] => <Путь к товару на сайте>
    [categoryId] => 2085
    [categoryParents] => Array
        (
            [0] => 2033
            [1] => 2085
        )
    [origSnippet] => <Путь к картинке на сайте>
    [parameters] => Array
        (
            [0] => Array
                (
                    [name] => Действующее вещество
                    [value] => АЦЕТИЛСАЛИЦИЛОВАЯ КИСЛОТА+КОФЕИН+ПАРАЦЕТАМОЛ
                )
        )
)

Пример раздела каталога:

Array
(
    [id] => 2033
    [value] => Лекарственные препараты
)

Пример исправления:

Array
 (
    [rule] => Misspell
    [text] => цитрамон
    [sourceText] => цэтромонь
)

Яндекс показывает все те данные о товаре и разделах, которые были в YML-фиде. Этого достаточно, и даже немного с избытком: нам хватило бы только ID товаров. Но регулировать перечень возвращаемых полей пока нельзя.

Имеет смысл указать в фиде только “вечнозеленые” данные, по которым идет поиск: название, описание, текстовые поля. А вот сиюминутные показатели, например: цены, наличие, сроки поставки — можно “довыбрать” непосредственно из БД сайта в момент показа поисковой выдачи.

Результат

Мы смогли сделать для клиентов устойчивый к опечаткам и ошибкам поиск.

Поиск Яндекса для Интернет-магазина — хорошая инициатива, но работает сервис пока с проблемами. Интегрироваться с платформой просто, но нужно грамотно “подстелить соломку” в нескольких местах, чтобы не получить мертвый поиск вместо умного.

Многие задачи требуют не просто разработки. Следует подумать об отказоустойчивости, масштабировании и гибкости. Мы предлагаем именно такой подход.

Оцените статью: