Фасетный Поиск (solr) против старой доброй фильтрации через PHP?
Я планирую настроить систему фильтров (уточнить поиск) в моих магазинах электронной коммерции. Вы можете увидеть пример здесь:http://www.bettymills.com/shop/product/find/Air + и + HVAC + фильтры
платформы, такие как PrestaShop, OpenCart и Magento, имеют так называемую многоуровневую навигацию.
мой вопрос в том, в чем разница между многоуровневой навигацией на таких платформах, как Magento или PrestaShop, по сравнению с использованием чего-то вроде Solr или Lucene для фасетной навигации.
может ли аналогичный результат быть достигнут только через php и mysql?
подробное объяснение очень ценится.
4 ответов
Многослойная Навигация = = Фасетный Поиск.
это одно и то же, но Magento и al используют разные формулировки, вероятно, чтобы быть броскими. Насколько мне известно, Magento поддерживает как поиск по Solr, так и поиск по MySQL. Главное отличие-производительность.
производительность является основным компромиссом.
для выполнения фасетного поиска в MySQL требуется объединение таблиц, в то время как Solr индексирует грани документа автоматически для фильтрации. Вы можете обычно быстрое время отклика достигается с помощью Solr (
недостатком Solr является то, что он требует настройки,безопасное и запустите еще одну службу на своем сервере. Он также может быть довольно интенсивным процессором и памятью в зависимости от вашей конфигурации (Tomcat, jetty, так далее.).
граненый поиск в PHP / MySQL возможен, и не так сложно, как вы думаете.
вам нужна определенная схема базы данных, но это возможно. Вот простой пример:
продукт
+----+------------+
| 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
, и включает в себя две грани: facet 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 с большим объемом памяти, вы также можете просто использовать встроенный в MySQL фасетный поиск Magento. Если у вас нет денег, чтобы потратить на Magento EE, вы можете использовать эта реализация solr. Но у меня нет никакого опыта с этим.
из поля solr вы можете использовать вычисляемый фасет, диапазон, выбрать фасет или исключить его, объявить, является ли фасет моно-или многозначным с очень низкой стоимостью cpu / ram
с другой стороны, требуется некоторое время для параметра и защиты установки solr, а также для обхода ваших данных.
вы можете создать фасетный поиск только с PHP и MySQL,Drupal Граненый Поиск хороший пример. Но если вы уже используете Solr, вы получаете фасетный поиск бесплатно.