ApacheSolrでの検索クエリを改善するための10のヒント

Apache Solrは本質的にオープンソースの検索エンジンですが、それだけではありません。これは、トランザクションをサポートするNoSQLデータベースです。これは、SQLサポートを提供し、分散して実行するドキュメントデータベースです。

以前、コレクションを作成してSolrにロードする方法を説明しました。以前に行ったことがない場合は、今すぐそのコレクションをロードできます。(完全な開示:私はSolrプロジェクトの主要な貢献者の多くを雇用しているLucidworksで働いています。)

この投稿では、そのコレクションでできることをさらに10個紹介します。

1.クエリをフィルタリングする

このクエリについて考えてみましょう。

//localhost:8983/solr/ipps/select?fq=Provider_State:NC&indent=on&q=*:*&wt=json

一見すると、このクエリは私が行った場合と似ていq=Provider_State:NCます。ただし、フィルタークエリはIDのみを返し、スコアには影響しません。フィルタクエリもキャッシュされます。これは、またはq=blue suededepartment:footwearはなく、で最も関連性の高いものを見つけるための良い方法です。department:clothingdepartment:music

2.ファセット

このクエリを試してください:

//localhost:8983/solr/ipps/select?facet=on&facet.field=Provider_State&facet.limit=-1&indent=on&q=*:*&wt=json

以下が上部に返されます。

ID

ファセットは、(とりわけ)カテゴリ数を示します。小売サイトを実装している場合、これは、部門のカテゴリとカテゴリ数を提供する方法、または在庫を分割するその他の方法です。

3.範囲ファセット

これをクエリ文字列に追加します。 facet.interval=Average_Total_Payments&facet.interval.set=[0,1999.99]&facet.interval.set=[2000,2999.99]&facet.interval.set=[3000,3999.99]&facet.interval.set=[4000,4999.99]&facet.interval.set=[5000,5999.99]&facet.interval.set=[6000,6999.99]&facet.interval.set=[7000,7999.99]&&facet.interval.set=[8000,8999.99]&facet.interval.set=[9000,10000]

あなたが得るでしょう:

この範囲ファセットは、数値フィールドを範囲のカテゴリに分割するのに役立ちます。誰かが2,000ドルから3,000ドルの範囲のラップトップを見つけるのを手伝っているなら、これはあなたのためです。代わりにこれを行うことにより、範囲をハードコーディングせずに同様のクエリを実行できます。facet.range=Average_Total_Payments&facet.range.gap=999.99&facet.range.start=2000&facet.range.end=10000

4.DocValues

スキーマで、docValuesファセットしているフィールドに対して属性が選択されていることを確認してください。これにより、次のschema.xmlの抜粋に示すように、これらの種類の検索のフィールドが最適化され、クエリ時にメモリが節約されます。

5.PseudoFields

データに対して操作を実行して、値を返すことができます。これを試して:

//localhost:8983/solr/ipps/select?fl=Provider_Name,%20Average_Total_Payments,price_category:if(min(0,sub(Average_Total_Payments,5000)),%22inexpensive%22,%22expensive%22)&indent=on&q=*:*&rows=10&wt=json

この例では、Solrの組み込み関数の一部を使用して、平均合計支払い額に基づいてプロバイダーを高額または低額に分類しています。私が入れprice_category:if(min(0,sub(Average_Total_Payments,5000)),"inexpensive","expensive")fl2つの他のフィールドと一緒に、またはフィールドリスト。

6.パーサーのクエリ

defTypeを使用すると、Solrのクエリパーサーの1つを選択できます。デフォルトの標準クエリパーサーは、特定のマシン生成クエリに非常に適しています。ただし、SolrにはDismaxパーサーとeDismaxパーサーもあり、通常のユーザーに適しdefType=dismaxています。管理クエリ画面の下部にあるいずれかをクリックするか、クエリ文字列に追加できます。Dismaxパーサーは通常、「論理和の最大値」、つまり最も一致するフィールドを見つけてスコアに追加することにより、ユーザーが入力したクエリに対してより良い結果を生成します。

7.ブースト

検索するとProvider_State:AL^5 OR Provider_State:NC^10、ノースカロライナの結果はアラバマの結果よりも高いスコアになります。これはクエリで実行できます(q="")。これは、返された結果を操作するための重要な方法です。

8.日付範囲

サンプルデータは日付範囲検索をサポートしていませんが、サポートしている場合は、のようにフォーマットされtimestamp_dt:[2016-12-31T17:51:44.000Z TO 2017-02-20T18:06:44.000Z]ます。Solrは、日付型フィールドと日付型の検索およびフィルタリングをサポートしています。

9.TF-IDFおよびBM25

Solrが(どのドキュメントが検索用語に関連しているかを判断するために)使用した元のスコアリングメカニズムは、「用語頻度と逆ドキュメント頻度」を表すTF-IDFと呼ばれます。フィールドまたはドキュメントで用語が出現する頻度と、コレクション全体でその用語が出現する頻度を返します。このアルゴリズムの問​​題は、「ゲーム・オブ・スローンズ」が10ページのドキュメントで100回発生するのに対し、10ページのドキュメントで10回発生しても、ドキュメントの関連性が10倍にならないことです。関連性は高くなりますが、関連性は10倍にはなりません。

BM25はこのプロセスをスムーズにし、ドキュメントを効果的に飽和点に到達させます。その後、追加の発生の影響が軽減されます。Solrの最近のバージョンはすべて、デフォルトでBM25を使用します。

10. debugQuery

管理クエリコンソールで、debugQueryをチェックdebugQuery=onしてSolrクエリ文字列に追加できます。結果を調べると、次の出力が見つかります。

とりわけ、LuceneQParser(標準のクエリパーサーの名前)を使用しており、その上で、各結果がどのようにスコアリングされたかがわかります。BM25アルゴリズム自体と、ブーストがスコアリングにどのように影響したかがわかります。検索をデバッグしようとしている場合、これは非常に価値のあるツールです。

Solrのこれらの10の側面は、検索と結果の調整にSolrを使用するときに確かに役立ちます。