web-dev-qa-db-ja.com

Solrクエリ(q)またはフィルタークエリ(fq)

〜1 milの製品ドキュメントSolrインデックスがあります。また、カテゴリ、タブ、価格帯、サイズ、色、その他のフィルターなどのUIフィルターも多数あります。

Qで_(q=\*:\*)_をすべて選択し、fqの他のすべてのフィルターを選択するのは正しい方法ですか?例:

fq=(catid:90 OR catid:81) AND priceEng:[38 TO 40] AND (size:39 OR size:40 OR size:41 OR size:50 OR size:72) AND (colorGroup:Yellow OR colorGroup:Violet OR colorGroup:Orange ... AND (companyId:81 OR companyId:691 OR companyId:671 OR companyId:628 OR companyId:185 OR companyId:602 OR ... AND endShipDays:[* TO 7])

私にとって、カテゴリからcompanyIds、色やサイズなどはすべて単なるフィルターです。このアプローチで将来の成長におけるパフォーマンスの問題はありますか?クエリのいくつかをqに入れるべきですか?

ありがとうございました、

27
Tommy Lord

可能な限り、通常のクエリよりもフィルタークエリを使用することをお勧めします。

FilterQueryFilterCache を利用できます。これはクエリと比較してパフォーマンスが大幅に向上します。

46
Jayendra

決定するために、フィールドについて次の点を調べます。

  1. フィールドのブーストスコアは固定されていますか、それともこのフィールドのスコアリングが必要ですか?はいの場合、上記のようにフィルタークエリはスコアを使用しないため、クエリに入れます。
  2. このフィールドの条件は頻繁に使用されますか? 「はい」の場合-繰り返しますが、前述のように、フィルターキャッシュは大きな利点をもたらす可能性がありますが、「いいえ」の場合はさらに遅くなる可能性があります。
  3. インデックスは一定ですか?これは#2と似ています。インデックスが頻繁に更新される場合、フィルタークエリの使用がパフォーマンスを向上させる代わりにボトルネックになる可能性があります。

#3についてのメモ:私の経験では、数秒ごとに新しいドキュメントが追加された大きなインデックスがあり、autoSoftCommitも数秒に設定されていました。ソフトコミット中に、キャッシュを無効にする新しいサーチャーが開かれました。つまり、実際に何が起こっていたか、フィルターヒット率はほとんど常に0でした。詳細はわかります。最初のフィルタークエリの実行は、すべてのフィルター条件が " fq」。たとえば、クエリが5つのフィルタークエリ(キャッシュヒットなし)で1秒かかり、すべての「fq」条件を「AND」でメインクエリに移動すると147msかかりました。しかし、もちろん、インデックスの更新を停止すると、キャッシュが使用されたため、同じフィルタークエリに0ミリ秒かかりました。したがって、これは考慮すべき事項です。

あなたの質問のための他のいくつかのポイント:

  • クエリでワイルドカードを使用しないでください。パフォーマンスに大きく影響します。したがって、「」の代わりに、要求ごとに一定でない条件(「要求ごとに最も一定のスコア」が必要な「fq」に1つの条件を使用することをお勧めします) )
  • 範囲検索も避けるべきです(可能な場合)。さらに、ワイルドカードを使用した範囲検索も可能です。 「endShipDays:[* TO 7]」についてです。たとえば、「endShipDays:(1 2 3 4 5 6 7)」を使用するとより効果的ですが、これは単なる例であり、多くの方法があります。

それが役に立てば幸い。

9
Yury K.

qおよびfqの使用方法。 qで全文検索を適用し、fqですべてのフィルターを適用します。あなたがフィールドを持っているとしましょうキーワードあなたのスキーマで定義されているようにフィールドで全文検索を行うことをコピーフィールドで

<copyField source="id" dest="keyword"/>
<copyField source="category" dest="keyword"/>
<copyField source="product_name" dest="keyword"/>
<copyField source="color" dest="keyword"/>
<copyField source="location" dest="keyword"/>
<copyField source="price" dest="keyword"/>
<copyField source="title" dest="keyword"/>
<copyField source="description" dest="keyword"/>

私のクエリは次のようになります

/select?q={keyword}&fq=category:fashion&fq=location:nyc

/select?q=jeans&fq=category:fashion&fq=location:nyc

Digitaljoelが示唆したように、複数のフィールドを照会する必要がある場合、ANDおよびOR with q =

注:私の場合、qデフォルトは、solrconfig.xmlで定義されているフィールドkeywordを参照します

<requestHandler name="/select" class="solr.SearchHandler">
<!-- default values for query parameters can be specified, these
     will be overridden by parameters in the request
  -->
 <lst name="defaults">
   <str name="echoParams">explicit</str>
   <int name="rows">10</int>
   <str name="df">keyword</str>
 </lst>
5
Manjunath Reddy