DisMaxクエリパーサー

DisMaxクエリパーサーは、ユーザーが入力した単純なフレーズ(複雑な構文なし)を処理し、複数のフィールドにわたる個々の用語を検索するために設計されています。各フィールドの重要度に基づいて異なる重み付け(ブースト)を使用して検索を行います。追加のオプションにより、ユーザーは各ユースケース固有のルールに基づいてスコアに影響を与えることができます(ユーザー入力とは無関係)。

一般的に、DisMaxクエリパーサーのインターフェースは、「lucene」SolrクエリパーサーのインターフェースよりもGoogleのインターフェースに似ています。この類似性により、DisMaxは多くのコンシューマーアプリケーションに適したクエリパーサーとなります。単純な構文を受け入れ、エラーメッセージをほとんど生成しません。

DisMaxクエリパーサーは、Lucene QueryParser構文の非常に簡略化されたサブセットをサポートしています。Luceneと同様に、引用符を使用してフレーズをグループ化し、+/-を使用して必須句とオプション句を示すことができます。その他のすべてのLuceneクエリパーサーの特殊文字(ANDとORを除く)は、ユーザーエクスペリエンスを簡素化するためにエスケープされます。DisMaxクエリパーサーは、ユーザー入力から、フィールドにわたるDisMaxクエリとユーザーが指定したブーストを含むブール句を使用して、適切なクエリを構築する役割を担っています。また、Solr管理者は、追加のブーストクエリ、ブースト関数、フィルタリングクエリを提供して、すべての検索の結果を人為的に影響を与えることができます。これらのオプションはすべて、solrconfig.xmlファイルのリクエストハンドラーのデフォルトパラメータとして指定するか、SolrクエリURLで実行時にオーバーライドできます。

DisMaxという名前の背後にある技術的な概念に興味がありますか?DisMaxはMaximum Disjunction(最大選言)の略です。最大選言または「DisMax」クエリの定義を以下に示します。

サブクエリによって生成されたドキュメントの集合を生成し、各ドキュメントを、任意のサブクエリによって生成されたそのドキュメントの最大スコアに、一致する追加のサブクエリごとにタイブレーキングインクリメントを加えたスコアで評価するクエリ。

この説明を覚えていなくても、DisMaxクエリパーサーは主に使いやすさを考慮して設計されており、エラーを返さずにほとんどすべての入力を受け入れることができることを覚えておいてください。

DisMaxクエリパーサーパラメータ

一般的なリクエストパラメータ、ハイライトパラメータ、単純なファセットパラメータに加えて、DisMaxクエリパーサーは以下で説明するパラメータをサポートしています。標準クエリパーサーと同様に、DisMaxクエリパーサーでは、solrconfig.xmlでデフォルトのパラメータ値を指定するか、リクエストの実行時値でオーバーライドできます。

以下のセクションでは、これらのパラメータについて詳しく説明します。

qパラメータ

q パラメータは、検索の中核をなす主要な「クエリ」を定義します。このパラメータは、特別なエスケープ処理なしでユーザーが提供する生の入力文字列をサポートします。+ と - の文字は、用語の「必須」および「禁止」修飾子として扱われます。バランスの取れた引用符で囲まれたテキスト(例:「San Jose」)はフレーズとして扱われます。引用符が奇数個含まれるクエリは、引用符がないものとして評価されます。

q パラメータは、* などのワイルドカード文字をサポートしません。

q.alt パラメータ

指定されている場合、q.alt パラメータは、主要な q パラメータが指定されていないか空の場合にクエリを定義します(デフォルトでは標準のクエリ構文解析を使用して解析されます)。q.alt パラメータは、コレクション全体のファセットカウントを取得するために、すべてのドキュメントに一致するクエリなどが必要な場合に便利です(その場合は &rows=0 を忘れないでください!)。

qf(クエリフィールド)パラメータ

qf パラメータは、フィールドのリストを導入します。各フィールドにはブースト係数が割り当てられ、クエリにおける特定のフィールドの重要度を高めたり下げたりします。たとえば、以下のクエリ

qf="fieldOne^2.3 fieldTwo fieldThree^0.4"

では、fieldOne に 2.3 のブーストが割り当てられ、fieldTwo はデフォルトのブースト(ブースト係数が指定されていないため)が使用され、fieldThree には 0.4 のブーストが割り当てられます。これらのブースト係数により、fieldOne の一致は fieldTwo の一致よりもはるかに重要になり、fieldTwo の一致は fieldThree の一致よりもはるかに重要になります。

mm(最小一致数)パラメータ

クエリを処理する場合、必須句、禁止句、「オプション」句(「should」句とも呼ばれる)の3種類の句があります。デフォルトでは、q パラメータで指定されたすべての単語またはフレーズは、「+」または「-」が前に付かない限り、「オプション」句として扱われます。これらの「オプション」句を扱う場合、mm パラメータを使用すると、それらの句のうち特定の最小数が一致する必要があることを指定できます。DisMax クエリパーサーは、最小数の指定方法に関して高い柔軟性を提供します。

以下の表は、mm 値を指定できるさまざまな方法を説明しています。

構文 説明

正の整数

3

句の総数に関係なく、一致する必要がある句の最小数を定義します。

負の整数

-2

一致する句の最小数を、オプション句の総数からこの値を引いた値に設定します。

パーセンテージ

75%

一致する句の最小数を、オプション句の総数のこのパーセンテージに設定します。パーセンテージから計算された数は切り捨てられ、最小値として使用されます。

負のパーセンテージ

-25%

オプション句の総数のこのパーセントが欠けていても良いことを示します。最小数を決定するために総数から引く前に、パーセンテージから計算された数は切り捨てられます。

正の整数に続いて > または < 記号と別の値が続く式

3<90%

オプション句の数が整数の値と等しいか小さい場合、それらはすべて必須であることを示す条件式を定義しますが、整数の値より大きい場合は、指定が適用されます。この例では、句が1~3個ある場合はすべて必須ですが、4個以上の句の場合は90%のみ必須です。

> または < 記号を含む複数の条件式

2<-25% 9<-3

複数の条件を定義します。各条件は、それより大きい数値に対してのみ有効です。左側の例では、句が1つまたは2つの場合、両方が必須です。句が3~9個ある場合は、25%を除くすべてが必須です。9個を超える句がある場合は、3つを除くすべてが必須です。

mm 値を指定する際には、次の点に注意してください。

  • パーセンテージを扱う場合、負の値を使用してエッジケースで異なる動作を得ることができます。75%と-25%は、4つの句を扱う場合同じ意味ですが、5つの句を扱う場合、75%は3つが必要であることを意味しますが、-25%は4つが必要であることを意味します。

  • パラメータ引数に基づいた計算で、オプション句が不要であると判断された場合、検索時のブールクエリの通常のルールは依然として適用されます。(つまり、必須句を含まないブールクエリは、少なくとも1つのオプション句と一致する必要があります)。

  • 計算結果がどのような数値であっても、Solrはオプション句の数より大きい値、または1より小さい値を使用することはありません。言い換えれば、計算結果がどれだけ低くても高くても、必要な一致の最小数は1より小さくも、句の数より大きくもなりません。

  • 異なるクエリアナライザーで構成された複数のフィールドを検索する場合、オプション句の数はフィールドによって異なる場合があります。このような場合、mm で指定された値は、オプション句の最大数に適用されます。たとえば、クエリ句が特定のフィールドのストップワードとして扱われる場合、そのフィールドのオプション句の数は他のフィールドよりも小さくなります。このようなストップワード句を含むクエリは、mm が 100% に設定されている場合、そのフィールドでは一致を返しませんが、削除された句は一致としてカウントされません。

mm のデフォルト値は 0%(すべての句がオプション)です。ただし、q.op が "AND" として指定されている場合は、mm のデフォルト値は 100%(すべての句が必須)になります。

pf(フレーズフィールド)パラメータ

fq および qf パラメータを使用して一致するドキュメントのリストが識別された後、pf パラメータを使用して、q パラメータ内のすべての用語が近接して表示される場合に、ドキュメントのスコアを「ブースト」できます。

形式は qf パラメータで使用されるものと同じです。フレーズクエリを全体の q パラメータから作成する場合に、各フィールドに関連付けるフィールドと「ブースト」のリストです。

ps(フレーズスロップ)パラメータ

ps パラメータは、pf パラメータで指定されたクエリに適用する「フレーズスロップ」の量を指定します。フレーズスロップとは、クエリのフレーズに一致させるために、トークンを別のトークンに対して移動する必要がある位置の数です。

qs(クエリフレーズスロップ)パラメータ

qs パラメータは、qf パラメータを使用してユーザーのクエリ文字列に明示的に含まれるフレーズクエリに許可されるスロップの量を指定します。上記のように、スロップとは、クエリのフレーズに一致させるために、トークンを別のトークンに対して移動する必要がある位置の数です。

tie(タイブレーカー)パラメータ

tie パラメータは、DisMax クエリでタイブレーカーとして使用する浮動小数点値(1 よりはるかに小さい値にする必要があります)を指定します。

ユーザーの入力からの用語が複数のフィールドに対してテストされると、複数のフィールドが一致することがあります。その場合、各フィールドは、その単語がそのフィールドでどの程度一般的であるか(他のすべてのドキュメントに対する各ドキュメント)に基づいて異なるスコアを生成します。tie パラメータを使用すると、クエリの最終スコアが、最高スコアのフィールドと比較して、低スコアのフィールドのスコアの影響を受ける程度を制御できます。

"0.0"(デフォルト)の値は、クエリを純粋な「ディスジャンクション最大クエリ」にします。つまり、最終スコアには最高スコアのサブクエリのみが貢献します。"1.0"の値はクエリを純粋な「ディスジャンクション合計クエリ」にし、最高スコアのサブクエリが何であっても関係なくなります。最終スコアはサブクエリのスコアの合計になるためです。通常、0.1 などの低い値が役立ちます。

bq(ブーストクエリ)パラメータ

bq パラメータは、追加のオプションのクエリ句を指定します。これは、ユーザーのメインクエリに追加され、スコアに影響を与えるオプション句になります。たとえば、特定のカテゴリにあるドキュメントにブーストを追加したい場合は、次のように使用できます。

q=cheese
bq=category:food^10

複数の bq パラメータを指定できます。それぞれが個別のブーストを持つ個別の句として追加されます。

q=cheese
bq=category:food^10
bq=category:deli^5

このように bq パラメータを使用することは、(元の)q パラメータが「必須」で他の句がオプションである単一のより大きなブールクエリに qbq パラメータを結合することと機能的に同等です。

q=(+cheese category:food^10 category:deli^5)

上記の例の違いは、bq パラメータを使用すると、これらの追加の句をメインクエリとは別に(つまり、構成のデフォルトとして)指定できることです。

加算ブーストと乗算ブースト

一般的に、bq(または下の bf)を使用することは、最終スコアに「加算」効果があるため、二次クエリによってドキュメントを「ブースト」する悪い方法と考えられています。特定の bq パラメータが特定のドキュメントに及ぼす全体的な影響は、元のクエリと bq クエリからのスコアの絶対値、元のクエリの複雑さ、さまざまなスコアリング要因(TF、IDF、平均フィールド長など)によって大きく異なります。

「乗算ブースト」は、相対的な量で各ドキュメントのスコアを増加(または減少)させる「スケーリングファクター」として機能するため、一般的に、ドキュメントスコアの変更方法としてより予測可能な方法と考えられています。

{!boost} QParser は乗算ブーストを実装するための便利なラッパーを提供し、{!edismax} QParser はそれを使用するboost クエリパラメータショートカットを提供します。

bf(ブースト関数)パラメータ

bf パラメータは、(オプションのクエリブースト付き)関数を使用してFunctionQueriesを構築します。これは、ユーザーのメインクエリに追加され、スコアに影響を与えるオプション句になります。Solr でネイティブにサポートされている関数は、ブースト値と共に使用できます。たとえば

q=cheese
bf=div(1,sum(1,price))^1.5

bf パラメータで関数を指定することは、本質的に、{!func} パーサーと組み合わせて bq パラメータを使用することの略記にすぎません(同じ欠点があります)。簡素化された「クエリブースト」構文が追加されています。

たとえば、以下にリストされている2つの bf パラメータは、以下の2つの bq パラメータと完全に同等です。

bf=div(sales_rank,ms(NOW,release_date))
bf=div(1,sum(1,price))^1.5
bq={!func}div(sales_rank,ms(NOW,release_date))
bq={!lucene}( {!func v='div(1,sum(1,price))'} )^1.5

DisMax クエリパーサーに送信されるクエリの例

このセクションのサンプルURLはすべて、Solr の「techproducts」例を実行していることを前提としています。

bin/solr -e techproducts

標準クエリパーサーを使用した単語「video」の結果。そして、「df」は検索するフィールドを指していると仮定します。

http://localhost:8983/solr/techproducts/select?q=video&fl=name+score

"dismax" パーサーは、text、features、name、sku、id、manu、cat フィールド全体を検索するように構成されており、それぞれ異なるブーストが設定されています。「より良い」一致が最初に表示されるように設計されています。具体的には、name フィールドと cat フィールドに一致するドキュメントは、より高いスコアを取得します。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video

このインスタンスは、デフォルトのフィールドリストも構成されていることに注意してください。これはURLで上書きできます。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=*,score

検索対象のフィールドと各フィールドが取得するブースト量も上書きできます。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&qf=features^20.0+text^0.3

特定の値に一致するフィールドを持つ結果をブーストできます。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&bq=cat:electronics^5.0

別のリクエストハンドラが "/instock" に登録されており、構成オプションが若干異なります。特に、(お分かりでしょうが)inStock:true のフィルタが設定されています。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video&fl=name,score,inStock

http://localhost:8983/solr/techproducts/instock?defType=dismax&q=video&fl=name,score,inStock

このパーサーのもう一つの優れた機能は、「BooleanQuery.minimumNumberShouldMatch」を、ユーザーのクエリ内の単語数に基づいて柔軟に指定できることです。これにより、タイプミスや部分一致に対応できます。dismaxパーサーでは、1語と2語のクエリではすべてのオプション句が一致する必要がありますが、3語から5語のクエリでは、1語が欠けていても許容されます。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+apple

debugQueryオプションを使用して、解析されたクエリと各ドキュメントのスコアの説明を確認してください。

http://localhost:8983/solr/techproducts/select?defType=dismax&q=belkin+ipod+gibberish&debugQuery=true

http://localhost:8983/solr/techproducts/select?defType=dismax&q=video+card&debugQuery=true