請求處理器和搜尋元件

solrconfig.xml<query> 區段之後,會設定請求處理器和搜尋元件。

請求處理器處理傳送到 Solr 的請求。這些可能是查詢請求、索引更新請求或特殊的互動,例如 Ping

並非所有處理器都在 solrconfig.xml 中明確定義,許多都是隱式定義的。請參閱隱式請求處理器以取得詳細資訊。

此外,可以使用 設定 APIconfigoverlay.json 中定義或覆寫處理器。最後,也可以使用 請求參數 API 定義獨立的參數集。它們將儲存在 params.json 檔案中,並使用 useParams 引用。

所有這些多層次的設定都可以透過 設定 API 驗證。

定義您自己的設定處理器通常是提供預設值和進階設定以支援業務案例並簡化客戶端 API 的有用方法。同時,使用本指南中解釋的每個選項,很可能會導致對實際使用哪個參數產生混淆。

定義和呼叫請求處理器

每個請求處理器都以名稱和類別定義。請求處理器的名稱會與 Solr 的請求一起引用,通常是作為路徑。例如,如果 Solr 安裝在 https://127.0.0.1:8983/solr/,並且您有一個名為「gettingstarted」的集合,則可以發出如下的請求

https://127.0.0.1:8983/solr/gettingstarted/select?q=solr

此查詢將由名為 /select 的請求處理器處理。這裡我們只使用了 "q" 參數,其中包含我們的查詢詞,一個簡單的關鍵字 "solr"。如果請求處理器定義了更多預設參數,除非客戶端(或使用者)在查詢本身中覆蓋它們,否則這些參數將與我們傳送給該請求處理器的任何查詢一起使用。

如果您定義了另一個請求處理器,您可以使用該名稱發送請求。例如,/update 是一個隱式的請求處理器,用於處理索引更新(即,將新文件傳送到索引)。預設情況下,/select 是一個處理查詢請求的請求處理器,也是大多數範例和工具所期望的。

請求處理器也可以處理名稱中巢狀路徑的請求,例如,使用 /myhandler/extrapath 的請求可以由註冊名稱為 /myhandler 的請求處理器處理。如果請求處理器明確定義為名稱 /myhandler/extrapath,則它將優先於巢狀路徑。這假設您正在使用 Solr 隨附的請求處理器類別;如果您建立自己的請求處理器,您應該確保它包含處理巢狀路徑的功能,如果您想將它們與您的自訂請求處理器一起使用。

如果預期請求處理器不經常使用,則可以使用 startup="lazy" 標記,以避免在需要時才載入。

<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
 ...
</requestHandler>

設定請求處理器

在請求處理器的定義中,有 3 種方法可以設定它們,另外還有 3 種方法可以在其他地方設定它們。

請求參數 (GET 和 POST)

最簡單和最靈活的方法是使用標準 GET 或 POST 請求提供參數。

以下是一個將參數 idflwt 發送到 /select 搜尋處理器的範例。請注意,fl 參數的值使用了 URL 編碼的空格(作為 +)。

https://127.0.0.1:8983/solr/techproducts/select?q=id:SP2514N&fl=id+name&wt=xml

以下是一個範例,說明如何使用 JSON Request API 通過 POST 表單將參數傳送到 /query 搜尋處理器。

curl https://127.0.0.1:8983/solr/techproducts/query -d '
{
  "query" : "memory",
  "filter" : "inStock:true"
}'

無論哪種方式,都會提取參數並與下面解釋的其他選項組合。

預設值、附加值和不變值

預設值

設定請求處理器最常見的方法是提供 defaults 區段。除非任何其他方法覆蓋了這些參數,否則將使用這些參數。

<requestHandler name="/select" class="solr.SearchHandler">
  <lst name="defaults">
    <str name="echoParams">explicit</str>
    <int name="rows">10</int>
  </lst>
</requestHandler>

此範例定義了一個有用的疑難排解參數 echoParams,其值僅返回請求本身中定義的參數(沒有預設值),設定為 all 可取得更多資訊。它還定義了 rows 參數,表示要返回的結果數量(每頁)(10 實際上是真正的預設值,因此如果不是要修改它,則此定義是多餘的)。

另請注意,如果參數是字串、整數或其他類型,則預設值在清單中的定義方式會有所不同。

以下是一些其他基本類型的表示方式

  <lst name="defaults">
    <float name="hl.regex.slop">0.5</float>
    <bool name="default">true</bool>
  </lst>

可能存在其他特殊類型,它們將在相關元件的章節中說明。

附加值

appends 區段中,您可以定義添加到其他地方已定義的參數。當可以有意義地多次定義相同的參數時,這些參數很有用,例如 篩選查詢。Solr 中沒有機制允許客戶端覆蓋這些新增項目,因此您應該絕對確定您始終希望將這些參數應用於查詢。

<lst name="appends">
  <str name="fq">inStock:true</str>
</lst>

在此範例中,篩選查詢 inStock:true 將始終添加到每個查詢中,強制僅返回可用的「產品」。

不變值

invariants 區段中,您可以定義客戶端無法覆蓋的參數。無論使用者、客戶端在 defaultsappends 中指定的值為何,都將始終使用 invariants 區段中定義的值。

<lst name="invariants">
  <str name="facet.field">cat</str>
  <str name="facet.field">manu_exact</str>
  <str name="facet.query">price:[* TO 500]</str>
  <str name="facet.query">price:[500 TO *]</str>
</lst>

在此範例中,facet.fieldfacet.query 參數將是固定的,限制了客戶端可以使用的 facet。預設情況下不會啟用 facet - 但是如果客戶端在請求中指定 facet=true,則這些是他們唯一能夠看到計數的 facet;無論他們可能指定了哪些其他 facet.fieldfacet.query 參數。

InitParams

也可以使用名為 initParams 的區段設定請求處理器的預設值。當您希望擁有每個獨立處理器都會使用的通用屬性時,可以使用這些預設值。例如,如果您打算建立多個請求處理器,這些處理器都將在回應中請求相同的欄位清單,則可以使用您的欄位清單設定 initParams 區段。有關 initParams 的更多資訊,請參閱 InitParams 區段。

Paramsets 和 UseParams

如果您預期經常更改參數,或者想要定義可以即時套用的參數集,您可以使用 請求參數 API 定義它們,然後在處理器定義本身或作為查詢參數中提供一個或多個 useParams 設定來調用它們。

<requestHandler name="/terms" class="solr.SearchHandler" useParams="myQueries">

...
</requestHandler>
https://127.0.0.1/solr/techproducts/select?useParams=myFacets,myQueries

如果調用了未定義的參數集,則會忽略它。這允許大多數 隱式請求處理器 調用您可以在以後根據需要定義的特定參數集。

搜尋處理器

搜尋處理器對 Solr 非常重要,因為資料(大致)索引一次,但搜尋多次。Solr (和 Lucene) 的整體設計是優化資料以進行搜尋,而搜尋處理器是通往該設計的靈活閘道。

以下區段允許在搜尋處理器中使用

<requestHandler name="/select" class="solr.SearchHandler">
... defaults/appends/invariants
... first-components/last-components or components
... shardHandlerFactory
</requestHandler>

所有區塊都是可選的,特別是因為參數也可以使用 initParamsuseParams 提供。

預設值/附加值/不變值區塊已在之前的 預設值、附加值和不變值 中說明。所有查詢參數都可以定義為任何搜尋處理器的參數。

接下來將說明搜尋元件區塊,而 shardHandlerFactory 用於微調 SolrCloud 分散式請求。

定義搜尋元件

搜尋元件本身是在請求處理器之外定義的,然後從想要使用它們的各種搜尋處理器中引用。大多數搜尋處理器使用預設的 - 隱式的 - 搜尋元件堆疊,並且偶爾只需要使用前置或附加的額外元件來擴充它們。完全覆蓋元件堆疊是相當罕見的 - 且有些脆弱 - 儘管在範例中使用了它來清楚地展示特定搜尋元件的效果。

預設元件

如下所示,我們看到的搜尋體驗主要是在下面定義的一系列元件。它們按照列出的順序調用。

元件名稱 類別名稱 更多資訊

query

solr.QueryComponent

查詢語法和剖析器 章節中描述。

facet

solr.FacetComponent

原始的基於參數的 facet 元件,在 分面 章節中描述。

facet_module

solr.facet.FacetModule

JSON 分面和分析模組,在 JSON 分面 API 章節中描述。

mlt

solr.MoreLikeThisComponent

MoreLikeThis 章節中描述。

highlight

solr.HighlightComponent

醒目提示 章節中描述。

stats

solr.StatsComponent

統計元件 章節中描述。

expand

solr.ExpandComponent

收合和展開結果 章節中描述。

terms

solr.TermsComponent

詞彙元件 章節中描述。

debug

solr.DebugComponent

在關於 debug 參數 的章節中描述。

隨附的自訂元件

除了預設元件之外,Solr 還隨附許多其他 - 非常有用的 - 元件。它們需要在 solrconfig.xml 中定義和引用才能實際使用。

  • AnalyticsComponent,在 分析元件 章節中描述(已過時)。

  • ClusteringComponent,在 結果分群 章節中描述。

  • PhrasesIdentificationComponent,用於識別和評分輸入字串中找到的「短語」,基於索引欄位中的 shingle,在 PhrasesIdentificationComponent javadocs 中描述。

  • QueryElevationComponent,在 查詢提升元件 章節中描述。

  • RealTimeGetComponent,在 即時取得 章節中描述。

  • ResponseLogComponent,用於通過 Solr 日誌記錄返回給使用者的文件,在 ResponseLogComponent javadocs 中描述。

  • SpellCheckComponent,在 拼字檢查 章節中描述。

  • SuggestComponent,在 建議器 章節中描述。

  • TermVectorComponent,在 詞彙向量元件 章節中描述。

某些第三方元件也連結到 https://solr.cool/ 網站。

定義自訂搜尋元件

若要定義自訂元件,語法為

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
  <lst name="spellchecker">
    <str name="classname">solr.IndexBasedSpellChecker</str>
    ...
  </lst>
</searchComponent>

自訂元件通常具有此處未說明的設定元素。有關詳細資訊,請查看特定元件的文件/範例。

請注意:如果您使用預設名稱之一註冊新的搜尋元件,則將使用新定義的元件而不是預設元件。這允許覆蓋特定的元件,而無需過多擔心升級 Solr。

引用搜尋元件

可以將某些元件定義為在上述預設元件之前(使用 first-components)或之後(使用 last-components)使用。

<searchComponent name="..." class="...">
 <arr name="first-components">
      <str>mycomponent</str>
    </arr>
    <arr name="last-components">
      <str>spellcheck</str>
    </arr>
</searchComponent>
以名稱「debug」註冊的元件將始終在「last-components」之後執行

如果您改為定義 components,則將不會執行 預設元件,並且不允許使用 first-componentslast-components。這應視為最後的選擇,因為預設清單可能會在稍後的 Solr 版本中變更。

<searchComponent name="..." class="...">
    <arr name="components">
      <str>mycomponent</str>
      <str>query</str>
      <str>debug</str>
    </arr>
</searchComponent>

更新請求處理器

更新請求處理器是用於處理索引更新的請求處理器。大多數可用的更新請求處理器都是隱式的,並且可以通過定義適當命名的參數集(Paramsets)進行自定義。

如果需要定義額外的更新請求處理器,語法如下:

<requestHandler name="/update/json" class="solr.UpdateRequestHandler">
... defaults/appends/invariants
</requestHandler>

完整細節請參閱使用更新處理器進行索引章節。

與搜尋處理器的搜尋元件類似,Solr 為更新請求處理器提供了文檔預處理外掛程式,稱為更新請求處理器,它們也允許預設和自訂的配置鏈。

注意:請勿將更新請求處理器與也在solrconfig.xml中定義的updateHandler區段混淆。