階層化されたナビゲーション == ファセット検索。
それらは同じものですが、Magento と al はおそらくキャッチーにするために異なる言葉遣いを使用しています。私の知る限り、Magento は Solr ファセット検索と MySQL ファセット検索の両方をサポートしています。主な違いはパフォーマンスです。
パフォーマンスは主なトレードオフです。
MySQL でファセット検索を行うには、テーブルを結合する必要がありますが、Solr はフィルタリングのためにドキュメント ファセットに自動的にインデックスを付けます。通常、Solr を使用すると、平均的なハードウェアで高速な応答時間 (多面的な検索クエリで 100 ミリ秒未満) を実現できます。MySQL は同じ検索に時間がかかりますが、インデックスを使用して最適化すると、同様の応答時間を達成できます。
Solr の欠点は、サーバー上でさらに別のサービスを構成、保護、および実行する必要があることです。また、構成 (Tomcat、jetty など) によっては、かなり CPU とメモリを集中的に使用することもあります。
PHP/MySQL でのファセット検索は可能ですが、思ったほど難しくはありません。
特定のデータベース スキーマが必要ですが、実現可能です。簡単な例を次に示します。
製品
+----+------------+
| id | name |
+----+------------+
| 1 | blue paint |
| 2 | red paint |
+----+------------+
分類
+----+----------+
| id | name |
+----+----------+
| 1 | color |
| 2 | material |
| 3 | dept |
+----+----------+
製品分類
+------------+-------------------+-------+
| 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
おり、2 つのファセットblue
(色のファセットとhome
部門のファセット) が含まれています。これにより、次のことが得られます。
+----+------------+
| id | name |
+----+------------+
| 1 | blue paint |
+----+------------+
では、結論として。これは Solr ですぐに使用できますが、SQL で簡単に実装することができます。