查詢提升元件

查詢提升元件可讓您設定指定查詢的頂端結果,而不用管一般的 Lucene 評分。

這有時稱為「贊助搜尋」、「編輯式加強」或「最佳選擇」。這個元件會將使用者查詢文字與已設定的頂端結果對應比對。文字可以是任何字串或非字串 ID,只要已建立索引即可。雖然此元件可搭配任何 QueryParser 使用,但最適合搭配 DisMax 查詢剖析器擴展 DisMax (eDisMax) 查詢剖析器使用。

查詢提升元件也支援分散式搜尋。

本節中使用的所有範例設定和查詢都假設您正在執行 Solr 的「techproducts」範例

bin/solr start -e techproducts

設定查詢提升元件

您可以在 solrconfig.xml 檔案中設定查詢提升元件。搜尋元件 (例如 QueryElevationComponent) 可以新增至任何請求處理常式;這裡為了簡潔起見,使用專用的請求處理常式。

<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" 不在結果集中。

請注意第三個規則中值為 "subset"match 參數。查詢 "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 參數

您可以透過將 exclusive=true 新增至 URL,強制 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

當篩選器被標記為排除時,它不會完全被忽略;而是被修改,以便提升的文件可以通過。未被提升的文件仍然受限於篩選器。