拡張 DisMax (eDisMax) クエリパーサー

拡張 DisMax (eDisMax) クエリパーサーは、DisMax クエリパーサー の改良版です。

DisMax クエリパーサーのパラメータをすべてサポートすることに加え、拡張 DisMax は

  • (網羅的ではないが) 標準クエリパーサー 構文(例:)をサポートしています。

    • AND (+, &&)、OR (||)、NOT (-) などのブール演算子。

    • Lucene 構文モードでは、小文字の "and" と "or" を "AND" と "OR" として扱うオプション。

    • 他のクエリパーサーまたは関数を使用した埋め込みクエリを許可するオプション。

  • 構文エラーの場合の改良されたスマート部分エスケープが含まれています。フィールドクエリ、+/-、フレーズクエリはこのモードでもサポートされています。

  • 単語シャッフルを使用することで近接ブーストが向上しました。近接ブーストを適用する前に、クエリがドキュメント内のすべての単語に一致する必要はありません。

  • 高度なストップワード処理が含まれています。ストップワードはクエリの必須部分には必要ありませんが、近接ブースト部分では引き続き使用されます。「to be or not to be」などのクエリがすべてストップワードで構成されている場合、すべての単語が必須になります。

  • ブースト関数の改良が含まれています。拡張 DisMax では、boost 関数は加算ではなく乗算であり、ブースト結果が向上します。DisMax の加算ブースト関数 (bfbq) もサポートされています。

  • 純粋なネガティブネストクエリをサポートしています。+foo (-foo) などのクエリは、すべてのドキュメントに一致します。

  • エンドユーザーがクエリを実行できるフィールドを指定し、直接的なフィールド検索を禁止することができます。

拡張 DisMax パラメータ

DisMax パラメータに加えて、拡張 DisMax には次のクエリパラメータが含まれています。

sow

空白文字で分割します。trueに設定すると、空白文字で区切られた各用語に対して個別にテキスト分析が実行されます。デフォルトはfalseです。空白文字で区切られた用語のシーケンスは、一度にテキスト分析に提供されます。これにより、用語シーケンス上で動作する分析フィルタ(例:複数単語の同義語とシャッフル)の適切な機能が有効になります。

mm

最小一致数。mmの説明については、DisMax mmパラメータを参照してください。eDisMaxのデフォルトのmm値は、DisMaxの値とは異なります。

  • デフォルトのmm値は0%です。

    • クエリに「AND」以外の明示的な演算子(「-」、「+」、「OR」、「NOT」)が含まれている場合。

    • または、q.opが「OR」であるか、指定されていない場合。

  • q.opが「AND」であり、クエリに「AND」以外の明示的な演算子が含まれていない場合、デフォルトのmm値は100%です。

mm.autoRelax

trueの場合、句が削除された場合(例:ストップワードフィルタによって一部のqfフィールドから削除された場合)、必要な句の数が自動的に緩和されます。qfフィールド間のストップワードの削除にばらつきがあるためにクエリがゼロヒットを返す場合、このパラメータを回避策として使用してください。

mmを緩和すると、インデックスの内容によっては、検索の精度が低下するなど、望ましくない副作用が発生する可能性があることに注意してください。

boost

文字列の複数値リスト。これは関数として解析され、その結果は、一致するすべてのドキュメントのメインクエリからのスコアに掛け合わされます。このパラメータは、BoostQParserPluginを使用してeDisMaxによって生成されたクエリをラップするための省略記法です。

これらの2つの例は同等です。

q={!edismax qf=name}ipod
boost=div(1,sum(1,price))
q={!boost b=div(1,sum(1,price)) v=$qq}
qq={!edismax qf=name}ipod
lowercaseOperators

小文字の"and"と"or"を演算子"AND"と"OR"と同じように扱うかどうかを示すブール値のパラメータです。デフォルトはfalseです。

pf

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

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

ps

句スロップ。pfpf2、および/またはpf3フィールドで作成されたフレーズクエリでのスロップ(用語間の距離)のデフォルト量(ブーストに影響します)。下記の「スロップの使用」セクションも参照してください。

pf2

オプションの重みを持つフィールドの複数値リスト。pfに似ていますが、単語のペアのシャッフルに基づいています。

ps2

これはpsに似ていますが、pf2で使用されるスロップ係数を上書きします。指定されていない場合、psが使用されます。

pf3

オプションの重みを持つフィールドの複数値リスト。単語のトリプレットのシャッフルに基づいています。pfに似ていますが、入力内のすべての単語からフィールドごとにフレーズを作成するのではなく、単語のトリプレットのシャッフルから各フィールドにフレーズのセットを作成します。

ps3

これはpsに似ていますが、pf3で使用されるスロップ係数を上書きします。指定されていない場合、psが使用されます。

stopwords

クエリアナライザで設定されているStopFilterFactoryをクエリを解析するときに尊重するかどうかを示すブール値のパラメータです。これをfalseに設定すると、クエリアナライザのStopFilterFactoryは無視されます。

uf

エンドユーザーが明示的にクエリを実行することを許可されているスキーマフィールドと、埋め込みSolrクエリがサポートされているかどうかを切り替えるかを指定します。このパラメータはワイルドカードをサポートしています。複数のフィールドはスペースで区切る必要があります。

デフォルトでは、すべてのフィールドと埋め込みSolrクエリを許可しません。これはuf=* -_query_と同等です。

  • titleフィールドのみを許可するには、uf=titleを使用します。

  • titleと'_s'で終わるすべてのフィールドを許可するには、uf=title *_sを使用します。

  • title以外のすべてのフィールドを許可するには、uf=* -titleを使用します。

  • すべてのフィールド検索を許可しないようにするには、uf=-*を使用します。

  • 埋め込みSolrクエリ(例:_query_:"…​"または_val_:"…​"または{!lucene …​})を許可するには、ufでマジックフィールド_query_を参照することにより、明示的に有効にする必要があります。

フィールド別qf上書きを使用したフィールドエイリアシング

qfパラメータのフィールド別上書きを指定して、クエリ文字列で指定されたフィールド名から、基礎となるクエリで使用されるフィールド名への1対多のエイリアシングを提供できます。デフォルトでは、エイリアシングは使用されず、クエリ文字列で指定されたフィールド名は、インデックス内のリテラルフィールド名として扱われます。

eDisMaxクエリの例

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

bin/solr -e techproducts

ドキュメントのpopularityに基づいて、クエリ用語「hello」の結果をブーストします。

https://127.0.0.1:8983/solr/techproducts/select?defType=edismax&q=hello&pf=text&qf=text&boost=popularity

iPodまたはビデオを検索します。

https://127.0.0.1:8983/solr/techproducts/select?defType=edismax&q=ipod+OR+video

複数のフィールドを検索し、(ブーストを使用して)各フィールドの重要度を相互に指定します。

https://127.0.0.1:8983/solr/techproducts/select?q=video&defType=edismax&qf=features^20.0+text^0.3

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

https://127.0.0.1:8983/solr/techproducts/select?q=video&defType=edismax&qf=features^20.0+text^0.3&bq=cat:electronics^5.0

mmパラメータを使用すると、1語と2語のクエリでは、すべてのオプション句が一致する必要がありますが、3語以上の句のクエリでは、1つの句が欠けていても許容されます。

https://127.0.0.1:8983/solr/techproducts/select?q=belkin+ipod&defType=edismax&mm=2
https://127.0.0.1:8983/solr/techproducts/select?q=belkin+ipod+gibberish&defType=edismax&mm=2
https://127.0.0.1:8983/solr/techproducts/select?q=belkin+ipod+apple&defType=edismax&mm=2

以下の例では、qfパラメータのフィールド別上書きを使用して、クエリ文字列の「name」を「last_name」フィールドと「first_name」フィールドのいずれかにエイリアスしている様子を示しています。

defType=edismax
q=sysadmin name:Mike
qf=title text last_name first_name
f.name.qf=last_name first_name

スロップの使用

DismaxEdismaxは、すべてのクエリフィールドに対してクエリを実行し、フレーズフィールドに対してフレーズ形式のクエリも実行できます(これはドキュメントのブーストには機能しますが、実際の一致には機能しません)。ただし、そのフレーズクエリには「スロップ」を設定でき、これはフレーズ一致と見なす際のクエリの用語間の距離です。例:

q=foo bar
qf=field1^5 field2^10
pf=field1^50 field2^20
defType=dismax

これらのパラメータを使用すると、DisMaxクエリパーサは次のようなクエリを生成します。

 (+(field1:foo^5 OR field2:foo^10) AND (field1:bar^5 OR field2:bar^10))

しかし、結果のブーストのみに使用される別のクエリも生成します。

field1:"foo bar"^50 OR field2:"foo bar"^20

したがって、「foo」と「bar」の両方の用語を含むドキュメントは一致しますが、それらのドキュメントの一部が両方の用語をフレーズとして含んでいる場合、関連性が高いため、スコアははるかに高くなります。

ps(フレーズスロップ)パラメータを追加すると、2番目のクエリは代わりに次のようになります。

ps=10 field1:"foo bar"~10^50 OR field2:"foo bar"~10^20

これは、「foo」と「bar」という用語がドキュメント内に互いに10語以下の距離で表示されている場合、フレーズが一致することを意味します。例えば、「…」というドキュメントは、

*Foo* term1 term2 term3 *bar*

フレーズクエリに一致します。

フレーズスロップをどのように使用するか?通常はリクエストハンドラ(solrconfig内)で設定されます。

クエリのスロップ(qs)では、概念は似ていますが、ユーザーからの明示的なフレーズクエリに適用されます。たとえば、名前を検索する場合、次のように入力できます。

q="Hans Anderson"

「Hans Anderson」を含むドキュメントは一致しますが、ミドルネーム「Christian」を含むドキュメントや、名字が先に書かれているドキュメント(「Anderson, Hans」)は一致しません。そのような場合、クエリフィールドqsを設定して、ユーザーが明示的なフレーズクエリを検索する場合でも、スロップが適用されるようにできます。

最後に、edismaxは、pfパラメータに加えて、バイグラムとトライグラムのフレーズクエリを作成するフィールドのpf2pf3パラメータもサポートしています。これらのパラメータのクエリのフレーズスロップは、それぞれps2ps3パラメータを使用して指定できます。pf2/pf3を使用してもps2/ps3を使用しない場合、これらのパラメータのクエリのフレーズスロップは、存在する場合はpsパラメータから取得されます。

スロップを使用したフレーズクエリでの同義語展開

スロップを使用したフレーズクエリ(例:psを使用したpf)が同義語の展開をトリガーすると、同義語の組み合わせごとに個別の句が生成されます。たとえば、同義語dog,caninecat,felineが設定されている場合、クエリ"dog chased cat"は次のフレーズクエリの句を生成します。

  • "dog chased cat"

  • "canine chased cat"

  • "dog chased feline"

  • "canine chased feline"