Гид компьютерного мира - Информационный портал

Фасетный поиск. Встроенный фасетный индекс

Встроенный фасетный поиск

Встроен в продукт

Встроенный в интернет-магазин фасетный поиск - внутренний поиск - работает быстро по многим параметрам и не нагружает при этом систему.

  • Встроен в продукт
  • Очень быстрый
  • Не нагружает сайт
  • Является основной частью API инфоблоков
  • Не требует переделки сайтов
  • Автоматически переиндексируется
Почему очень быстрый?

Клиенту моментально выводится заранее подготовленные результаты поиска - по любой комбинации параметров - фасете. Система заранее просчитывает фасеты для товара - всевозможные пересечения этих свойств в фильтре. Эти готовые поисковые наборы потом выдаются клиентам.

Почему не нагружает сайт?

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

Преимущества для клиентов

Преимущества фасетного поиска

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


«Умный» фильтр 2.0

Клиент быстро находит товар

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

Интерактивность и многомерность

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

Удобство и дружелюбность

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

Клиент не ждет обработки запроса!
Например, ваш клиент покупает фотоаппарат. Первоначально он указывает в умном фильтре всего 3 параметра: цена, бренд, размер. Его фасета включает 3 пересечения, результатов поиска много, но клиент их получает немедленно. Клиент задает вес - ему нужен легкий гаджет. Система тут же, без задержки выдает ему меньший список товаров. Клиент задает размер экрана, потом уточняет нужный функционал. Перед ним - искомые товары.


Скорость поиска

Скорость поиска имеет значение

Скорость поиска влияет на число совершаемых покупок

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


Видеооурок: Почему фасетный поиск ускоряет умный фильтр в разы
Использование «фасеты» на порядок ускоряет поиск внутри магазина. При этом скорость не зависит от количества элементов в каталоге.

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

Скорость работы впечатляет!

Результаты теста версии 15.0 продукта на трех категориях каталогов, содержащих 500 тысяч наименований показали, что по сравнению с предыдущими версиями:
  • Компонент умного фильтра – в 15 раз быстрее!
  • Компонент каталога – в 5 раз быстрее!
Интеллект поиска остается постоянным!

Быстро даже без «фасеты»!

В продукте постоянно ведется работа над ускорением самих компонетов каталога. Сервис «Скорость сайта» показывает значительное повышение скорости от версии к версии!

Реконструкция

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

Разработчкам: прозрачность для API


Прежний вид

«Фасета» прозрачна для API

Встроенная в продукт «фасета» прозрачна для API. Является основной частью API инфоблоков. Поэтому для ее использования не нужны дополнительные усилия для разработчиков. Также не требуется и переделка сайтов.
  • Ускорение метода CIBlockElement::GetList
  • Полная интеграция с умным фильтром
GetList теперь работает быстрее, потому что для своего функционирования автоматически подключает «фасету». Также появился отдельный API на D7.

Полная интеграция с умным фильтром

Теперь, выполняя настройки в административной части, для свойств товаров можно не только проставить активность - участвовать или нет в умном фильтре. Передавая свойство в Умный фильтр, вы можете сразу же выбрать вариант их отображения. В каком виде показывать свойство клиентам: кнопки, размеры, ползунки, выпадающие списки, списки с выбором цвета и т.д.



Показывать свойство в Умном фильтре

Поддается кастомизации!

Умный фильтр стал выглядеть красивее. Разработчики могут легко кастомизировать и настраивать дополнительно его внешний вид.

{ "query": { "and": [ { "terms": {"country": ["be", "fr"]} }, { "terms": {"category": ["books", "movies"]} } ] } }

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

{ "query": { "and": [ { "terms": {"country": ["be", "fr"]} }, { "terms": {"category": ["books", "movies"]} } ] }, "aggregations": { "countries": { "terms": {"field": "country"} }, "categories": { "terms": {"field": "category"} } } }

Если бы вы выполнили этот запрос, вы заметите, что счетчики отключены. В двух не отобранных странах, в Португалии и Бразилии, есть счетчик 0. Хотя есть фактические результаты, если мы хотим их выбрать (из-за ORвнутренней грани). Это происходит потому, что по умолчанию Elasticsearch выполняет свои агрегирования в результирующем наборе. Это означает, что если вы выберете Францию, фильтры другой страны будут иметь счет 0, потому что в результирующем наборе содержатся только элементы из Франции.

Чтобы исправить это, нам нужно дать команду Elasticsearch выполнить агрегацию во всем наборе данных, игнорируя запрос. Мы можем сделать это, определив наши скопления как глобальные.

{ "query": { "and": [ { "terms": {"country": ["be", "fr"]} }, { "terms": {"category": ["books", "movies"]} } ] }, "aggregations": { "all_products": { "global": {}, "aggregations": { "countries": { "terms": {"field": "country"} }, "categories": { "terms": {"field": "category"} } } } } }

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

{ "query": { "and": [ { "terms": {"country": ["be", "fr"]} }, { "terms": {"category": ["books", "movies"]} } ] }, "aggregations": { "all_products": { "global": {}, "aggregations": { "countries": { "filter": { "and": [ { "terms": {"category": ["books","movies"]} } ] }, "aggregations": { "filtered_countries": { "terms": {"field": "country"} } } }, "categories": { "filter": { "and": [ { "terms": {"country": ["be","fr"]} } ] }, "aggregations": { "filtered_categories": { "terms": {"field": "category"} } } } } } } }

{ "took": 153, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 3, "max_score": 0, "hits": ["..."] }, "aggregations": { "all_products": { "doc_count": 21, "filterted categories": { "doc_count": 13, "categories": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "movies", "doc_count": 6 }, { "key": "music", "doc_count": 4 }, { "key": "books", "doc_count": 3 } ] } }, "filtered_countries": { "doc_count": 15, "countries": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "fr", "doc_count": 6 }, { "key": "br", "doc_count": 4 }, { "key": "be", "doc_count": 3 }, { "key": "pt", "doc_count": 2 } ] } } } } }

Yii2 framework

$terms = QueryHelper:: terms ("categories.name" , "my category" ) ; $nested = QueryHelper:: nested ("string_facet" , QueryHelper:: filter ([ QueryHelper:: term ("string_facet.facet_name" , [ "value" => $id , "boost" => 1 ] ) , QueryHelper:: term ("string_facet.facet_value" , [ "value" => $value , "boost" => 1 ] ) , ] ) ) ; $filter = QueryHelper:: should ($nested ) ;

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

И так давайте перейдем непосредственно к установке и настройке нужных нам модулей

Для начала нам понадобятся скачать и установить следующие модули: Search API , Search API Database Search , Entity API и Views .

На странице модулей включаем:

  • Search API
  • Search views
  • Database search
  • Entity API
  • Views
  • Views UI
  • Ctools

Создание поискового сервера

Идем в Конфигурация > Поиск и метаданные > Search API (/admin/config/search/search_api) и нажимаем Добавить сервер .
Затем вводим имя сервера, в выпадающем списке Класс сервиса (Service class) выбираем Database service и сохраняем.

Создание индекса

Идем в Конфигурация > Поиск и метаданные > Search API (/admin/config/search/search_api), жмем Добавить сервер (Add index) .
Вводим название индекса, в поле Тип элемента (Item type) выбираем ‘Материал ‘, в поле Сервер выбираем Database server , жмем Создание индекс.


В открывшейся форме отмечаем галочками поля, по которым будет производится сортировка, и сохраняемся.
Чтобы можно было делать сортировку по названию ноды, включаем title и напротив него в выпадающем списке выбираем тип string , а не fulltext . По fulltext сортировку делать нельзя.

В следующей открывшейся форме Фильтры (workflow) я оставил все по умолчанию, переходим на вкладку Просмотр (Status ), и нажимаем Индексировать сейчас (Index Now ).
После завершения индексации, создадим страницу поиска.

Создание страницы поиска

Идем в Structure > Views и жмем Добавить новое представление (Add new view) .
В новом представление в выпадающем списке Показать (Show) выбираем ранее созданный нами индекс, остальные поля (название, title и путь) заполняете так как вам нужно.


Далее нажимаем Сохранить и настроить (Continue & edit), настраиваем представление как обычно. В критериях фильтрации я добавил показ только опубликованных материалов и нужный тип node и настроил отображение необходимых полей (нужно добавить эти поля в индекс, чтобы иметь возможность фильтровать по ним).

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

A/search_api_ranges.module +++ b/search_api_ranges.module @@ -144,11 +144,8 @@ function search_api_ranges_minmax($variables, $order = "ASC") { // otherwise our min/max would always equal user input. $filters = &$query->getFilter()->getFilters(); foreach ($filters as $key => $filter) { - - // Check for array: old style filters are objects which we can skip. - if (is_array($filter)) { - if ($filter == $variables["range_field"] || ($filter != $variables["range_field"] && $filter == "")) { - $current_filter = $filters[$key]; + if(isset($filter->tags) && is_array($filter->tags)){ + if(in_array("facet:".$variables["range_field"], $filter->tags)){ unset($filters[$key]); } }

Патчим JQuery UI Slider: настраиваем редирект

В версии модуля 7х-1.5 я столкнулся с тем, что если виджет слайдера расположен на странице, отличной от страницы поиска, то после изменения диапазона цены проиходило пере направление на текущую страницу, а не на страницу поиска.
Ошибка кроется в функии search_api_ranges_block_slider_view_form_submit() (файл search_api_ranges.module, строка 364).
Я не стал особо разбираться, что там и зачем, просто немного изменил код в строке 427:

Drupal_goto($path, array("query" => array($params), "language" => $language)); + drupal_goto($values["path"], array("query" => array($params), "language" => $language));

после чего проблема решилась.

Фасетная навигация – это проблема всех e-commerce сайтов. Чрезмерное количество страниц, которые используются для разных вариантов одного и того же элемента, создает угрозу эффективности поиска. Это может негативно повлиять на SEO и пользовательский опыт. Что такое фасетная навигация, и как ее улучшить, рассказали специалисты из блога SEO Hacker.

Фасетная навигация: определение

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

Фасеты и фильтры отличаются друг от друга. Вот в чем заключается разница:

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

  • Фильтры используются для сортировки и уточнения элементов внутри списков. Они необходимы для пользователей, но не для поисковых систем. Фильтры не индексируются, потому что они не меняют содержимое страницы, а лишь сортируют ее в другом порядке. Это приводит к множественному URL-адресу, имеющему дублированный контент.

Потенциальные проблемы

У каждой возможной комбинации фасетов есть собственный уникальный URL-адрес. Он может стать причиной некоторых проблем с точки зрения SEO. Вот основные из них:

  • Дублированный контент.
  • Трата бюджета на сканирование.
  • Устранение разницы в ссылках.

По мере роста вашего сайта увеличивается и количество дублированных страниц. Входящие ссылки могут поступать на различные дублированные страницы. Это снижает ценность ссылок и ограничивает возможности ранжирования страниц.

Повышается также вероятность каннибализации ключевых слов. Несколько страниц пытаются ранжировать одни и те же ключевые слова, что приводит к менее стабильному и более низкому ранжированию. Этой проблемы можно было бы избежать, если бы каждое ключевое слово предназначалось только для отдельной страницы.

Решения для фасетной навигации

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

AJAX

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

AJAX может быть эффективен только до запуска сайта e-commerce. Для решения проблем уже существующих ресурсов он не используется. Также этот метод требует определенных трат с вашей стороны.

Тег noindex

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

Это не решит проблемы с бюджетом на обход, потому что боты все равно будут посещать вашу страницу. Это также не помогает распределить ценность ссылок.

Атрибут rel=canonical

С помощью этого атрибута вы сообщаете Google, что у вас есть одна основная предпочтительная страница для индексирования и ранжирования, а все остальные версии контента с этой страницы – всего лишь дубликаты, которые не нужно индексировать.

София Ибрагимова

Контент-маркетолог

Если на одну и ту же страницу вашего сайта можно попасть по нескольким URL-адресам, поисковые роботы будут расценивать каждый адрес как отдельную страницу. Боты решат, что контент на вашем сайте неуникален, а это отрицательно скажется на ранжировании и снизит ваши позиции в выдаче. Чтобы этого избежать, укажите основную каноническую страницу, вставив в блок HEAD следующую последовательность символов:

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

Robots.txt

Закрытие части страниц от индексации позволяет добиться хороших результатов. Это простой, быстрый и надежный способ. Удобнее всего установить настраиваемый параметр для указания всех возможных комбинаций фасетов и фильтров, которые вы хотите заблокировать. Включите его в конец каждого URL-адреса, который хотите скрыть (http://полный адрес страницы/robots.txt) или используйте метатег Robots в области HEAD кода страницы.

При изменении в URL-адресе необходимо помнить, что роботам требуется 3-4 недели, чтобы заметить эти изменения и среагировать на них.

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

Консоль Google Search

Это отличный способ временно исправить свои проблемы, пока вы работаете над созданием более совершенной и удобной системы навигации. Вы можете использовать консоль Google Search, чтобы сообщить поисковику, как сканировать ваш сайт.

  • Нажмите на кнопку «Параметры URL» (URL Parameters):

  • Укажите влияние каждого из ваших параметров на страницу и то, как Google должен обрабатывать эти страницы.

Помните, что этот способ скрывает дублированный контент только от поисковых роботов Google. В Bing и Yahoo станицы по-прежнему будут отображаться.

Как улучшить фасетную навигацию

Рассмотрим вкратце все методы, которые позволяют создать правильную фасетную навигацию:

  • Использование AJAX
  • Удаление или скрытие ссылок на категории или страницы фильтров, на которых отсутствует контент.
  • Разрешение индексирования определенных комбинаций фасетов, которые имеют большой объем поиска трафика
  • Установка иерархии сайтов через хлебные крошки в категориях и подкатегориях.
  • Создание канонических (основных) страниц для дублированного контента.
  • Консолидация индексирующих свойств со страниц компонентов на весь ряд с помощью разметки страницы с rel = "next" и rel = "prev" .

Заключение

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

Лучшие статьи по теме