拡張 DisMax (eDisMax) クエリパーサー
拡張 DisMax (eDisMax) クエリパーサーは、DisMax クエリパーサー の改良版です。
DisMax クエリパーサーのパラメータをすべてサポートすることに加え、拡張 DisMax は
-
(網羅的ではないが) 標準クエリパーサー 構文(例:)をサポートしています。
-
AND (+, &&)、OR (||)、NOT (-) などのブール演算子。
-
Lucene 構文モードでは、小文字の "and" と "or" を "AND" と "OR" として扱うオプション。
-
他のクエリパーサーまたは関数を使用した埋め込みクエリを許可するオプション。
-
-
構文エラーの場合の改良されたスマート部分エスケープが含まれています。フィールドクエリ、+/-、フレーズクエリはこのモードでもサポートされています。
-
単語シャッフルを使用することで近接ブーストが向上しました。近接ブーストを適用する前に、クエリがドキュメント内のすべての単語に一致する必要はありません。
-
高度なストップワード処理が含まれています。ストップワードはクエリの必須部分には必要ありませんが、近接ブースト部分では引き続き使用されます。「to be or not to be」などのクエリがすべてストップワードで構成されている場合、すべての単語が必須になります。
-
ブースト関数の改良が含まれています。拡張 DisMax では、
boost
関数は加算ではなく乗算であり、ブースト結果が向上します。DisMax の加算ブースト関数 (bf
とbq
) もサポートされています。 -
純粋なネガティブネストクエリをサポートしています。
+foo (-foo)
などのクエリは、すべてのドキュメントに一致します。 -
エンドユーザーがクエリを実行できるフィールドを指定し、直接的なフィールド検索を禁止することができます。
拡張 DisMax パラメータ
DisMax パラメータに加えて、拡張 DisMax には次のクエリパラメータが含まれています。
sow
-
空白文字で分割します。
true
に設定すると、空白文字で区切られた各用語に対して個別にテキスト分析が実行されます。デフォルトはfalse
です。空白文字で区切られた用語のシーケンスは、一度にテキスト分析に提供されます。これにより、用語シーケンス上で動作する分析フィルタ(例:複数単語の同義語とシャッフル)の適切な機能が有効になります。 mm
-
最小一致数。
mm
の説明については、DisMaxmm
パラメータを参照してください。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
-
句スロップ。
pf
、pf2
、および/または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_
を参照することにより、明示的に有効にする必要があります。
-
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
スロップの使用
Dismax
とEdismax
は、すべてのクエリフィールドに対してクエリを実行し、フレーズフィールドに対してフレーズ形式のクエリも実行できます(これはドキュメントのブーストには機能しますが、実際の一致には機能しません)。ただし、そのフレーズクエリには「スロップ」を設定でき、これはフレーズ一致と見なす際のクエリの用語間の距離です。例:
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
パラメータに加えて、バイグラムとトライグラムのフレーズクエリを作成するフィールドのpf2
とpf3
パラメータもサポートしています。これらのパラメータのクエリのフレーズスロップは、それぞれps2
とps3
パラメータを使用して指定できます。pf2
/pf3
を使用してもps2
/ps3
を使用しない場合、これらのパラメータのクエリのフレーズスロップは、存在する場合はps
パラメータから取得されます。