На чому краще продати фасетний пошук. Як створити фасетний пошук за допомогою лічильників фасетів? Ми щоразу вибираємо дані з MySQL

( "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 ) ;

У сьогоднішньому уроці ми з вами спробуємо відтворити імітацію фасетного пошуку засобами Javascript. Я маю на увазі, що ви вже знаєте що таке фасетний пошук, якщо читаєте даний туторіал, інакше погуглите або загляньте на Amazon або мою Демку.

Для початку нам знадобиться бібліотека github.com/eikes/facetedsearch. Завантажте її та підключіть файл facetedsearch.js до нашого проекту. Також нам знадобляться бібліотеки jQuery та Underscore.

Дисклеймер: Я розумію, що JQ вже давно не торт, але використовую його як звичний синтаксичний цукор, ви можете перепиляти це під звичніші вам бібліотеки або на ванільному JS.

Отже для початку зробимо просту розмітку з підключеними залежностями:

Document // Сюди ми виведемо фасетні фільтри // А тут будуть наші елементи

Тепер нам потрібно описати налаштування нашої програми та створити шаблон виведення елементів масиву, які ми будемо сортувати за допомогою фасетів:

$(function()( var item_template = // Описуємо шаблон "" + " " class="img-responsive">" + ", " + "

" + "" + ", " + ", " + "

" + "

" + ""; settings = ( items: example_items, facets: ( // Вказуємо категорії фасетів "category" : "What Category", "continent" : "Which Continent", "language" : "Programming Language" ), resultSelector: "#results", // DOM елемент куди ми виводимо результати facetSelector: "#facets", // DOM елемент для фасетів resultTemplate: item_template, paginationCount: 8, // Кількість елементів на сторінку orderByOptions: ("firstname": "First name ", "lastname": "Last name", "category": "Category", "RANDOM": "Random"), facetSortOption: ("continent": ["North America", "South America"]) ) $. facetelize(settings); ));

Ну і власне створити сам JSON масив з елементами для відображення у нашому фасетному пошуку на JS:

Var items = [ ( "firstname": "Mary", "lastname": "Smith", "imageURL": "http://lorempixel.com/150/150/cats/2", "description": "Sed Ea Amet. Stet Voluptua. Nonumy Magna Takimata", "category": "Mouse", "language": ["Smalltalk", "XSLT"], "continent": "Africa"), ("firstname": "Patricia", "lastname": "Johnson", "imageURL": "http://lorempixel.com/150/150/cats/3", "description": "Ut Takimata Sit Aliquyam Labore Aliquyam Sit Sit Lorem Amet. Ipsum Rebum." , "category": "Lion", "continent": "North America"), ...];

Цей масив я би виніс у окремий JS файл котрий би формувався динамічно, з БД наприклад.

Ось, власне і все, ми отримуємо фасетний пошук на JavaScript і можемо його кастомізувати. Далі я наводжу перекладену документацію бібліотеки, де ви можете підглянути необхідні вам тригери.

Документація Функції

Дві функції експортуються до простору імен jQuery.

facetelize Використовується для ініціалізації фасетного пошуку із заданими налаштуваннями.

facetUpdate Може використовуватися, якщо потрібно змінити стан фасетного пошуку ззовні.

Налаштування об'єктів

items: Масив елементів, які будуть відфільтровані та відсортовані у процесі.

facets: Об'єкт, для якого ключі відповідають ключам елементів та значенням, є заголовком для цього фасету. Елементи буде відфільтровано на основі того, яке значення вони мають для цих ключів.

orderByOptions: Подібно до фасетів, за винятком того, що ці пари «ключ-значення» використовуються тільки для сортування. Коли ключ RANDOM увімкнено, результати можуть бути рандомізовані.

facetSelector: Це селектор, який використовується для пошуку DOM-вузла, з якого вибираються фільтри фасетів.

resultSelector: Це селектор, який використовується для пошуку DOM-вузла, де відображаються результати.

resultTemplate: Рядок, який використовується Underscore шаблонизатором Для рендерингу кожного елемента з масиву items . Наступні атрибути додаються до кожного елемента, який також можна використовувати у шаблоні: batchItemNr, batchItemCount та totalItemCount.

state: Цей об'єкт зберігає поточні фільтри, сортує: currentResult та інші. Ви можете надати рядок orderBy або об'єкти filters для їх попереднього налаштування.

enablePagination: Boolean для включення пагіналору та кнопки "load more", за умовчанням true .

paginationCount: Якщо увімкнено пагінатор, задає кількість елементів на сторінку, за замовчуванням - 50.

facetSortOption: Використовуйте цю функцію, щоб змінити порядок елементів фасетів. Приймає об'єкт, в якому ключі відповідають іменам фасетів і значенням масив значень фасетів, які можуть бути розташовані в тому порядку, в якому ви хотіли б їх бачити. У цьому прикладі будуть відсортовані континенти в іншому порядку, елементи, не включені до масиву, будуть додані в алфавітному порядку:

FacetSortOption: ("continent": ["North America", "South America"])

Є ще кілька шаблонів, будь ласка, перегляньте вихідний код facetedsearch.js , щоб побачити всі доступні параметри шаблону.

Події

Ви можете прив'язуватися до деяких подій, які повинні надіслати повідомлення, коли відбулися деякі дії. Для цього використовуємо систему подій jquery:

facetuicreated: Ви можете прив'язати цю функцію до DOM елементу settings.facetSelector який повинен бути повідомлений, коли інтерфейс користувача був створений.

facetedsearchresultupdate: Ви можете прив'язати цю функцію до елемента DOM settings.resultSelector щоб отримати повідомлення про результати оновлення.

facetedsearchfacetclick: Ця подія викликається при натисканні фасета і його спрацюванні на елементі settings.facetSelector. Який отримує ідентифікатор фасету як аргумент.

facetedsearchorderby: Ця подія викликається при натисканні елемента сортування за елементом settings.facetSelector. Він отримує ID order як аргумент.

$(settings.resultSelector).bind("facetedsearchresultupdate", function()( // do something, maybe ));

Сучасна людина намагається витрачати на покупки дедалі менше часу. Повільні каталоги товарів відштовхують покупців, магазин втрачає клієнтів та частину прибутку. Зробіть свій інтернет-магазин привабливішим разом із технологією фасетного фасетного - тобто. зумовлений. пошуку. Створіть фасетні індекси та значно прискоріть пошук товарів та роботу всього каталогу.

Примітка: Механізм фасетного пошуку доступний з версії 15.0.1 модуля Інформаційні блоки та інтегрований з компонентом Компонент – це програмний код, оформлений у візуальну оболонку, що виконує певну функцію будь-якого модуля з виведення даних у Публічній частині. Ми можемо вставляти блок коду на сторінки сайту без безпосереднього написання коду. Розумний фільтр Компонент готує фільтр для вибірки з інфоблоку та виводить форму фільтра для фільтрації елементів. Компонент повинен підключатися перед компонентом виведення елементів каталогу, інакше список елементів не буде фільтруватися. Компонент стандартний, входить до дистрибутиву модуля і містить три шаблони: .default , visual_horizontal і visual_vertical . (Останні два шаблони не підтримуються, залишилися для збереження сумісності.)

У візуальному редакторі компонент розташований на шляху Контент > Каталог > Розумний фільтр.

Компонент відноситься до модуль Інформаційні блоки.

Докладніше про фасетний пошук

Розглянемо з прикладу:

Ми заходимо в інтернет-магазин і у фільтрі вибираємо, що нам потрібна футболка червоного кольору:

  • Без фасетного пошуку фільтр почав би перебирати весь список товарів на відповідність товару "Футболка" з властивістю колір "Червоний", що зайняло б чимало часу за великої кількості товару;
  • Якщо налаштувати фасетний пошук, то створюються готові пошукові набори товарів за певним значенням якості (фасетні індекси), тобто. варіанти можливих запитів Наприклад, червона футболка, всі товари чорного кольору з бавовни, сукні розміру XS і т.д. у розумному фільтрі прораховані заздалегідь і результат видається відразу. Такий пошук товарів працює набагато швидше.

Створимо фасетні індекси за кілька простих дій:

Чи потрібно перестворювати фасетні індекси?

Фасетні індекси перетворюються автоматично або потрібно перестворити їх вручну в залежності від дій:

Автоматично Додали нові або відредагували існуючі товари.
не створюють нових властивостей.
Вручну Система підкаже вам про це за допомогою повідомлення вгорі сторінок
адміністративного поділу.
Додали нові або відредагували розділи каталогу.
При додаванні нового або видаленні властивості з розумного фільтра.
При розвантаженні товарів, наприклад, із 1С, якщо товари створюють нові властивості.

Фасетний пошук покращує роботу каталогу товарів. Для його використання необхідно:

  • Створити фасетні індекси для каталогу із товарами;
  • Слідкувати за сповіщенням про необхідність перестворення індексів вручну.
  • Фасетна навігація – проблема всіх 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, щоб повідомити пошукову систему, як сканувати ваш сайт.

    • Увійдіть до облікового запису консолі та виберіть розділ «Сканування» (Crawl):

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

    • Вкажіть вплив кожного з параметрів на сторінку і те, як Google повинен обробляти ці сторінки.

    Пам'ятайте, що цей спосіб приховує дубльований контент лише від пошукових роботів Google. У Bing та Yahoo станиці, як і раніше, відображатимуться.

    Як покращити фасетну навігацію

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

    • Використання AJAX
    • Видалення або приховування посилань на категорії або сторінки фільтрів, на яких відсутній вміст.
    • Дозвіл індексування певних комбінацій фасетів, які мають великий обсяг пошуку трафіку
    • Встановлення ієрархії сайтів через хлібні крихти у категоріях та підкатегоріях.
    • Створення канонічних сторінок для дубльованого контенту.
    • Консолідація індексуючих властивостей зі сторінок компонентів весь ряд за допомогою розмітки сторінки з rel = "next" і rel = "prev" .
    Висновок

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