Многоуровневая навигация == Фасетный поиск.
Это одно и то же, но 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 довольно легко.