Я планирую настроить систему фильтров (уточнить ваш поиск) в моих магазинах электронной торговли. Здесь вы можете увидеть пример: http://www.bettymills.com/shop/product/find/Air+and+HVAC+Filters
Платформы, такие как PrestaShop, OpenCart и Magento, имеют так называемую многоуровневую навигацию.
Мой вопрос в том, какова разница между многоуровневой навигацией на таких платформах, как Magento или PrestaShop, по сравнению с использованием чего-то вроде Solr или Lucene для фасетной навигации.
Может ли аналогичный результат быть выполнен через только php и mysql?
Подробное объяснение очень ценится.
Это одно и то же, но Magento и al используют разные формулировки, вероятно, быть броскими. Насколько я знаю, Magento поддерживает как Solr-фасетный поиск, так и MySQL. Основное отличие – производительность.
Для выполнения фасетного поиска в MySQL требуется присоединиться к таблицам, в то время как Solr автоматически индексирует графы документа для фильтрации. Обычно вы можете получить быстрое время отклика, используя Solr (<100 мс для многоаспектного поискового запроса) на среднем оборудовании. Хотя MySQL займет больше времени для одного и того же поиска, его можно оптимизировать с помощью индексов для достижения аналогичного времени отклика.
Недостатком Solr является то, что он требует, чтобы вы настраивали, защищали и запускали еще одну услугу на своем сервере. Это может быть довольно интенсивным CPU и интенсивной памятью в зависимости от вашей конфигурации (Tomcat, причал и т. Д.).
Вам нужна конкретная схема базы данных, но это возможно. Вот простой пример:
продукт
+----+------------+ | id | name | +----+------------+ | 1 | blue paint | | 2 | red paint | +----+------------+
классификация
+----+----------+ | id | name | +----+----------+ | 1 | color | | 2 | material | | 3 | dept | +----+----------+
product_classification
+------------+-------------------+-------+ | product_id | classification_id | value | +------------+-------------------+-------+ | 1 | 1 | blue | | 1 | 2 | latex | | 1 | 3 | paint | | 1 | 3 | home | | 2 | 1 | red | | 2 | 2 | latex | | 2 | 3 | paint | | 2 | 3 | home | +------------+-------------------+-------+
Итак, скажите, что кто-то ищет paint
, вы бы сделали что-то вроде:
SELECT p.* FROM product p WHERE name LIKE '%paint%';
Это приведет к возврату обеих записей из таблицы product
.
Как только ваш поиск будет выполнен, вы можете получить связанные грани (фильтры) вашего результата с помощью запроса, подобного этому:
SELECT c.id, c.name, pc.value FROM product p LEFT JOIN product_classification pc ON pc.product_id = p.id LEFT JOIN classification c ON c.id = pc.classification_id WHERE p.name LIKE '%paint%' GROUP BY c.id, pc.value ORDER BY c.id;
Это даст вам что-то вроде:
+------+----------+-------+ | id | name | value | +------+----------+-------+ | 1 | color | blue | | 1 | color | red | | 2 | material | latex | | 3 | dept | home | | 3 | dept | paint | +------+----------+-------+
Итак, в вашем результирующем наборе вы знаете, что есть продукты, цвет которых blue
и red
, что единственный материал, из которого он сделан, – latex
, и что его можно найти в отделах home
и paint
.
Как только пользователь выбирает фасет, просто измените исходный поисковый запрос:
SELECT p.* FROM product p LEFT JOIN product_classification pc ON pc.product_id = p.id WHERE p.name LIKE '%paint%' AND ( (pc.classification_id = 1 AND pc.value = 'blue') OR (pc.classification_id = 3 AND pc.value = 'home') ) GROUP BY p.id HAVING COUNT(p.id) = 2;
Итак, здесь пользователь ищет ключевую paint
и включает в себя две грани: грань blue
цвета, а также home
для отдела. Это даст вам:
+----+------------+ | id | name | +----+------------+ | 1 | blue paint | +----+------------+
Итак, в заключение. Хотя он доступен из коробки в Solr, его можно легко реализовать в SQL.
Magento Enterprise Edition имеет реализацию Solr с фасетным поиском. Тем не менее вам нужно настроить Solr для индексации правильных данных; т.е. Solr работает на Java на узле с определенным портом. Magento подключается к нему через заданный URL-адрес. Когда Magento устанавливает фасетный поиск, он запрашивает Solr и обрабатывает полученный xml в форме на интерфейсе. Разница была бы одной из скоростей. Запросить Solr очень быстро. Если у вас есть около 100 000 продуктов в вашем магазине и вы хотите быстро ответить на запросы поиска, вы можете использовать Solr. Но все же, если у вас есть отдельный сервер для базы данных Magento с большой памятью, вы также можете просто использовать Magento, встроенный в грантовый поиск на основе Mysql. Если у вас нет денег на Magento EE, вы можете использовать эту реализацию solr . Но у меня нет опыта с этим.
из поля solr вы можете использовать рассчитанную грань, диапазон, выбрать грань или исключить ее, объявить, является ли фасет монооценкой или многозначным с очень низкой стоимостью процессора / бара
С другой стороны, требуется некоторое время для параметра и защиты установки solr, также требуется некоторое время для сканирования ваших данных.
Вы можете создать фасетный поиск только с PHP и MySQL, хорошим примером является Drupal Faceted Search . Но если вы уже используете Solr, вы получите бесплатный доступ к фасетному поиску.