Фасетный поиск (solr) против старой доброй фильтрации через PHP? - PullRequest
24 голосов
/ 31 августа 2011

Я планирую настроить систему фильтров (уточните поиск) в моих интернет-магазинах.Вы можете увидеть пример здесь: http://www.bettymills.com/shop/product/find/Air+and+HVAC+Filters

Платформы, такие как PrestaShop, OpenCart и Magento, имеют так называемую многоуровневую навигацию.

Мой вопрос - в чем разница между многоуровневой навигацией в платформах?такие как Magento или PrestaShop по сравнению с использованием чего-то вроде Solr или Lucene для граненой навигации.

Может ли аналогичный результат быть достигнут с помощью только php и mysql?

Подробное объяснение высоко ценится.

Ответы [ 4 ]

50 голосов
/ 31 августа 2011

Многоуровневая навигация == Фасетный поиск.

Это одно и то же, но Magento и все используют разные формулировки, вероятно, чтобы бросаться в глаза. Насколько я знаю, Magento поддерживает как граненый поиск Solr, так и MySQL. Основным отличием является производительность.

Производительность - главный компромисс.

Для выполнения фасетного поиска в MySQL требуется объединить таблицы, в то время как Solr автоматически индексирует фасеты документа для фильтрации. Как правило, вы можете добиться быстрого времени отклика, используя Solr (<100 мс для многогранного поискового запроса) на среднем оборудовании. Хотя для того же поиска MySQL будет занимать больше времени, его можно оптимизировать с помощью индексов для достижения аналогичного времени ответа. </p>

Недостатком Solr является то, что он требует от вас настройки secure и запуска еще одной службы на вашем сервере. В зависимости от конфигурации (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 и включает в себя два аспекта: фасет blue для цвета и home для отдела. Это даст вам:

+----+------------+
| id | name       |
+----+------------+
|  1 | blue paint |
+----+------------+

Итак, в заключение. Хотя он доступен в Solr "из коробки", реализовать его в SQL довольно легко.

1 голос
/ 02 мая 2012

из поля solr, вы можете использовать вычисленный фасет, диапазон, выбрать фасет или исключить его, объявить, является ли фасет моноценным или многозначным с очень низкой стоимостью процессора / оперативной памяти

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

1 голос
/ 31 августа 2011

Magento Enterprise Edition имеет реализацию Solr с фасетным поиском. Тем не менее вам нужно настроить Solr для индексации правильных данных; Т.е. Solr работает на Java на хосте с определенным портом. Magento подключается к нему через данный URL. Когда Magento настраивает граненый поиск, он запрашивает Solr и обрабатывает полученный xml в форме на внешнем интерфейсе. Разница будет в скорости. Запрос к Solr очень быстрый. Если в вашем магазине более 100 000 товаров и вы хотите быстро отвечать на поисковые запросы, вы можете использовать Solr. Но, тем не менее, если у вас есть отдельный сервер для базы данных Magento с большим объемом памяти, вы также можете просто использовать встроенный в Mensql многогранный поиск в Mysql. Если у вас нет денег на Magento EE, вы можете использовать эту реализацию solr . Но у меня нет никакого опыта с этим.

0 голосов
/ 31 августа 2011

Вы можете создать граненый поиск только с помощью PHP и MySQL, Хороший пример - Drupal Faceted Search .Но если вы уже используете Solr, вы получите бесплатный поиск по многогранному поиску.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...