クエリ昇格コンポーネント

クエリ昇格コンポーネントを使用すると、通常の 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

useConfiguredElevatedOrderパラメータ

リクエストパラメータとして提供することで、実行時にuseConfiguredElevatedOrderを強制的に設定できます。

ドキュメントトランスフォーマーと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

フィルタが除外のためにタグ付けされると、完全に無視されるわけではなく、昇格されたドキュメントが通過できるように変更されます。昇格されていないドキュメントは、引き続きフィルタの対象となります。