web-dev-qa-db-ja.com

ファセット検索(solr)とPHPを介した古き良きフィルタリング?

Eコマースストアにフィルターシステムを設定する(検索を絞り込む)ことを計画しています。ここで例を見ることができます: http://www.bettymills.com/shop/product/find/Air+and+HVAC+Filters

PrestaShop、OpenCart、Magentoなどのプラットフォームには、レイヤードナビゲーションと呼ばれるものがあります。

私の質問は、ファセットナビゲーションにSolrやLuceneなどを使用する場合と比較して、MagentoやPrestaShopなどのプラットフォームのレイヤードナビゲーションの違いは何ですか。

Phpとmysqlだけで同様の結果を達成できますか?

詳細な説明をいただければ幸いです。

25
Adil

階層化されたナビゲーション==ファセット検索。

それらは同じものですが、Magentoとalは、おそらくキャッチーであるために、異なる表現を使用しています。私の知る限り、MagentoはSolrファセット検索とMySQL検索の両方をサポートしています。主な違いはパフォーマンスです。

パフォーマンスが主なトレードオフです。

MySQLでファセット検索を実行するには、テーブルを結合する必要がありますが、Solrはフィルタリングのためにドキュメントファセットに自動的にインデックスを付けます。通常、平均的なハードウェアでSolr(多面的な検索クエリの場合は<100ms)を使用すると、高速な応答時間を実現できます。 MySQLは同じ検索に時間がかかりますが、インデックスを使用して最適化すると、同様の応答時間を実現できます。

Solrの欠点は、サーバー上でさらに別のサービスを構成してsecure実行する必要があることです。また、構成(Tomcat、桟橋など)によっては、CPUとメモリをかなり消費する可能性があります。

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 |
+------+----------+-------+

したがって、結果セットでは、色がblueredである製品があり、それが作成される唯一の材料は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の2つのファセットが含まれています。これはあなたに与えるでしょう:

+----+------------+
| id | name       |
+----+------------+
|  1 | blue Paint |
+----+------------+

したがって、結論として。 Solrですぐに使用できますが、SQLでかなり簡単に実装することができます。

52
netcoder

solrボックスから、計算されたファセット、範囲を使用し、ファセットを選択または除外し、ファセットが単一値であるか、または非常に低いCPU/RAMコストで複数値であるかを宣言できます。

一方、solrのインストールをパラメーター化して保護するには時間がかかります。また、データのクロールにも時間がかかります。

1
flo850

Magento Enterprise Editionには、ファセット検索を備えたSolrの実装があります。それでも、正しいデータにインデックスを付けるようにSolrを構成する必要があります。つまり、Solrは特定のポートを持つホスト上でJavaで実行されます。Magentoは指定されたURLを介してホストに接続します。Magentoがファセット検索を設定すると、Solrにリクエストを実行し、受信したxmlを処理します。フロントエンドのフォームに変換します。違いは速度の1つです。Solrへのリクエストは非常に高速です。ショップに約100,000以上の製品があり、検索リクエストに迅速に応答したい場合は、Solrを使用できます。大量のメモリを備えたMagentoデータベース用に別のサーバーがある場合は、Magentoに組み込まれているMysqlベースのファセット検索を使用することもできます。MagentoEEに費やすお金がない場合は、 このSolr実装)を使用できます。 。しかし、私はこれについての経験がありません。

1
y_a_v_a

PHPとMySQL、 Drupal Faceted Search だけでファセット検索を作成できますが、すでにSolrを使用している場合は、ファセット検索が無料で含まれています。

0