クエリ昇格コンポーネント
クエリ昇格コンポーネントを使用すると、通常の Lucene スコアリングに関係なく、特定のクエリの上位結果を設定できます。
これは、場合によっては「スポンサー付き検索」、「編集によるブースト」、「ベストベット」と呼ばれます。このコンポーネントは、ユーザーのクエリテキストと、上位結果の構成済みマップを照合します。テキストは、インデックスされている限り、任意の文字列または非文字列 ID でかまいません。このコンポーネントはどの QueryParser とも連携しますが、DisMax クエリパーサまたは拡張 DisMax (eDisMax) クエリパーサと併用するのが最も理にかなっています。
クエリ昇格コンポーネントは、分散検索もサポートしています。
このセクションで使用されているサンプル設定とクエリはすべて、Solr の「techproducts」例を実行していることを前提としています。
bin/solr -e techproducts
クエリ昇格コンポーネントの設定
solrconfig.xml
ファイルでクエリ昇格コンポーネントを設定できます。QueryElevationComponent
などの検索コンポーネントは、任意のリクエストハンドラに追加できます。簡潔にするために、ここでは専用のRequest Handlerを使用しています。
<searchComponent name="elevator" class="solr.QueryElevationComponent" >
<!-- pick a fieldType to analyze queries -->
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
<requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="echoParams">explicit</str>
</lst>
<arr name="last-components">
<str>elevator</str>
</arr>
</requestHandler>
オプションとして、クエリ昇格コンポーネントの設定で、編集結果と「通常の」結果を区別するために、以下を指定することもできます。
<str name="editorialMarkerFieldName">foo</str>
クエリ昇格検索コンポーネントは以下のパラメータを受け入れます。
queryFieldType
-
必須
デフォルト: なし
着信テキストの分析に使用するフィールドタイプを指定します。たとえば、
LowerCaseFilter
を含むフィールドタイプを使用するのが適切な場合があります。別の例として、バックスラッシュでエスケープされたクエリをアンエスケープする必要がある場合、
PatternReplaceCharFilter
で前処理を行うようにフィールドタイプを定義できます。フィールドタイプの対応する例を以下に示します。<fieldType name="unescapelowercase" class="solr.TextField"> <analyzer> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="\\(.)" replacement="$1"/> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
たとえば、英数字以外の文字のみをアンエスケープするには、パターンを
\\([^\p{IsAlphabetic}\p{Digit}])
にすることができます。 config-file
-
必須
デフォルト: なし
昇格ルールを定義するファイルへのパス。このファイルはconfigsetに存在する必要があります。ほとんどの設定とは異なり、このコンポーネントはコミット後にファイルが変更された場合、その設定を再読み込みします。ただし、これは SolrCloud では機能せず、コミットに影響を与えるために実際のインデックスの変更が必要であり、変更を検出する方法として使用するには影響を受けるコア/コレクションを実際に再読み込みする必要があります。いずれの場合も、configset の新しい設定を使用するには、影響を受けるコア/コレクションを再読み込みできます。
forceElevation
-
オプション
デフォルト:
false
デフォルトでは、このコンポーネントは要求された
sort
パラメータを尊重します。日付でソートするよう要求された場合、結果は日付順に並び替えられます。forceElevation=true
の場合、最初にブーストされたドキュメントが返され、その後日付順に並び替えられます。デフォルトはfalse
です。これはリクエストパラメータでもあり、設定を上書きします。 useConfiguredElevatedOrder
-
オプション
デフォルト:
true
複数のドキュメントが昇格されている場合、それらの相対的な順序は設定ファイルの順序にするべきか、それともソート基準に従うべきか?これはリクエストパラメータでもあり、設定を上書きします。この効果は、
forceElevation
がtrueで、フィールドのソートがある場合に最も顕著です。 elevateOnlyDocsMatchingQuery
-
オプション
デフォルト:
false
デフォルトでは、このコンポーネントは検索結果に含まれていない(クエリに一致する)ドキュメントも昇格させます。検索結果に含まれるドキュメントのみを昇格させたい場合は、これを
true
に設定します。
elevate.xmlファイル
昇格されたクエリ結果は、config-file
引数で指定された外部XMLファイルで設定できます。elevate.xml
ファイルは次のようになる場合があります。
<elevate>
<query text="foo bar">
<doc id="1" />
<doc id="2" />
<doc id="3" />
</query>
<query text="ipod">
<doc id="MA147LL/A" /> <!-- put the actual ipod at the top -->
<doc id="IW-02" exclude="true" /> <!-- exclude this cable -->
</query>
<query text="foo bill" match="subset">
<doc id="11" />
</query>
</elevate>
この例では、「foo bar」クエリは最初にドキュメント1、2、3を返し、その後、同じクエリに対して通常表示されるものを返します。「ipod」クエリの場合、最初に「MA147LL/A」が返され、「IW-02」が結果セットに含まれないようにします。
3番目のルールでは、match
パラメータの値が"subset"
になっていることに注意してください。「bill bar foo」クエリは、ルールがクエリに表示される用語のサブセットを任意の順序で定義しているため、このルールをトリガーします。このクエリは、ドキュメント11を最上位に昇格させます。match
パラメータは"exact"
(デフォルト)または"subset"
の値を受け入れます。サブセットマッチングはスケーラブルであり、match="subset"
パラメータを使用して多くのルールを追加できます。
昇格させるドキュメントがelevate.xml
ファイルに定義されていない場合は、elevateIds
パラメータを使用してクエリ時に渡す必要があります。
クエリ昇格コンポーネントの使用
enableElevationパラメータ
デバッグのために、昇格されたドキュメントありとなしの結果を確認すると便利です。結果を非表示にするには、enableElevation=false
を使用します。
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=true
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=false
forceElevationパラメータ
実行時にforceElevation=true
をクエリURLに追加することで、昇格を強制できます。
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&enableElevation=true&forceElevation=true
exclusiveパラメータ
URLにexclusive=true
を追加することで、Solrに昇格ファイルに指定された結果のみを返すように強制できます。
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&debugQuery=true&exclusive=true
ドキュメントトランスフォーマーとmarkExcludesパラメータ
[elevated]
ドキュメントトランスフォーマを使用して、各ドキュメントに昇格されたかどうかに関する情報を注釈として付けることができます。
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&fl=id,[elevated]
同様に、昇格設定によって通常除外されるドキュメントを含む、すべての照合ドキュメントを確認すると、トラブルシューティングに役立ちます。これは、markExcludes=true
パラメータを使用し、[excluded]
トランスフォーマを使用することで可能です。
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&markExcludes=true&fl=id,[elevated],[excluded]
elevateIdsおよびexcludeIdsパラメータ
昇格コンポーネントが使用されている場合、クエリに対する事前設定された昇格リストは、リクエスト時にこれらのリクエストパラメータで指定された一意のキーを使用するように上書きできます。
たとえば、以下のリクエストでは、ドキュメント3007WFPと9885A004が昇格され、ドキュメントIW-02が除外されます。これは、elevate.xmlで「cable」クエリに対して設定されている昇格または除外とは関係ありません。
https://127.0.0.1:8983/solr/techproducts/elevate?q=cable&df=text&excludeIds=IW-02&elevateIds=3007WFP,9885A004
これらのパラメータのいずれかがリクエスト時に指定されている場合、クエリに対する昇格設定全体が無視されます。
たとえば、以下のリクエストでは、ドキュメントIW-02とF8V7067-APL-KITが昇格され、ドキュメントは除外されません。これは、elevate.xmlで「ipod」クエリに対して設定されている昇格または除外とは関係ありません。
https://127.0.0.1:8983/solr/techproducts/elevate?q=ipod&df=text&elevateIds=IW-02,F8V7067-APL-KIT
fqパラメータと昇格
デフォルトでは、クエリ昇格は標準のフィルタクエリ(fq
)パラメータを尊重します。つまり、クエリにfq
パラメータが含まれている場合、elevate.xml
が結果セットに他のドキュメントを追加する場合でも、すべての結果は、そのフィルタ内に含まれます。
特定のフィルタクエリに一致するかどうかとは関係なく、昇格されたドキュメントを結果セットに含めたい場合は、LocalParams構文を使用してこれらのフィルタクエリにタグを付け、elevate.excludeTags
リクエストパラメータを使用して除外するタグを指定できます。tag
ローカルパラメータとelevate.excludeTags
リクエストパラメータの両方で、コンマで区切ることで複数の値を指定できます。
q=mainquery&fq=status:public&fq={!tag=dt}doctype:pdf&elevate.excludeTags=dt
q=mainquery&fq=status:public&fq={!tag=t1,t2}a:b&fq={!tag=t3}c:d&fq={!tag=t4}e:f&elevate.excludeTags=t1,t4
フィルタが除外のためにタグ付けされると、完全に無視されるわけではなく、昇格されたドキュメントが通過できるように変更されます。昇格されていないドキュメントは、引き続きフィルタの対象となります。