Фасетный Поиск (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, вы получаете фасетный поиск бесплатно.