3

新しいサイト (ショッピング サイト) では、サイトの検索エンジンに Solr を使用します。Solr インデックスでは、製品 ID のリストと各製品のキーワードのリストを保持しています。検索クエリは、キーワードに対して実行されます。

Solr は製品 ID のリストを返します。次に、これらの ID が MySQL クエリに挿入され、データベースからすべての製品データが選択されます。MySQL は結果のソートも処理します。たとえば、MySQL クエリは次のようになります。

SELECT * FROM product WHERE id IN (1,4,42,32,46,...,39482) ORDER BY price ASC

サイトには約100,000の製品があります。この方法は、数千件の結果がある場合はうまく機能しますが、たとえば 50,000 件の結果がある場合は遅くなります。

私の推測では、ボトルネックは「WHERE IN」句です。長期的な解決策は、すべての製品データを Solr に移動して、結果の並べ替えと検索への絞り込みフィルターの適用を処理できるようにすることです (たとえば、ユーザーが特定の価格帯の製品のみを表示したい場合など)。ただし、Solr には不慣れであり、これを実装する前に短期的な修正が必要です。

1 つのオプションは、短期的には Solr を放棄し、MySQL のテーブルにキーワードを保存し、全文検索を使用してこれに対して検索を行うことです。

他のオプションがありませんか?

4

1 に答える 1

6

あなたにとっての主な問題は、Solr が一致するキーワードの数でソートされた結果を返すことですが、結果を価格でソートしたいということです。あなたが正しく言及したように、すべてのデータを Solr に移動することが最善の選択肢です。検索、並べ替え、ファセット、およびページネーションのニーズに対して Solr に非常に満足しています。

ただし、短期的には、priceフィールドを Solr に追加するだけでも価値があります。次のような検索クエリを取得すると、次のようtooth pasteな Solr クエリを発行できます。

q=keywords:(tooth AND paste)&rows=10&fl=id&sort=price%20asc

最初の 10 件の結果のみを取得し、startパラメーターを指定してページネーションを行うには、次のようにします。

q=keywords:(tooth AND paste)&rows=10&start=10&fl=id&sort=price%20asc
于 2013-02-19T15:21:05.820 に答える