InitParams

solrconfig.xml<initParams> 區段允許您在處理器設定之外定義請求處理器參數。

在以下幾種情況下可能會需要這樣做

  • 某些處理器是在程式碼中隱式定義的(請參閱隱式請求處理器),而且應該有一種方法可以新增、附加或覆寫某些隱式定義的屬性。

  • 有一些屬性是在多個處理器中使用的。這有助於您只保留這些屬性的單一定義,並將其應用於多個處理器。

例如,如果您希望多個搜尋處理器傳回相同的欄位列表,您可以建立一個 <initParams> 區段,而無需在每個請求處理器定義中定義相同的參數集。如果您有一個應該傳回不同欄位的單一請求處理器,您可以像往常一樣在個別的 <requestHandler> 區段中定義覆寫參數。

<initParams> 區段的屬性和設定與請求處理器的屬性和設定相同。它可以包含 defaults、appends 和 invariants 等區段,與任何請求處理器相同。

例如,以下是預設在 _default 範例中定義的 <initParams> 區段之一

<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell">
  <lst name="defaults">
    <str name="df">_text_</str>
  </lst>
</initParams>

這會將所有路徑區段中指定的請求處理器的預設搜尋欄位 ("df") 設定為 "text"。如果我們稍後想要將 /query 請求處理器變更為預設搜尋不同的欄位,我們可以透過在 /query<requestHandler> 區段中定義參數來覆寫 <initParams>

語法和語意與 <requestHandler> 相似。以下是屬性

path

選用

預設值:無

將使用參數的路徑的逗號分隔清單。路徑中可以使用萬用字元來定義巢狀路徑,如下所述。

name

選用

預設值:無

這組參數的名稱。如果沒有明確指定路徑,則可以直接在 requestHandler 定義中使用此名稱。如果您為 <initParams> 設定了名稱,您可以在未定義為路徑的 <requestHandler> 中引用這些參數。

例如,如果 <initParams> 區段的名稱為「myParams」,您可以在定義請求處理器時呼叫此名稱。

<requestHandler name="/dump1" class="DumpRequestHandler" initParams="myParams"/>

initParams 中的萬用字元

<initParams> 區段可以支援萬用字元,以定義應使用已定義參數的巢狀路徑。單個星號 (*) 表示應使用參數的巢狀路徑深度為一層。雙星號 (**) 表示所有巢狀路徑,無論深度如何,都應使用這些參數。

例如,如果我們有一個如下所示的 <initParams>

<initParams name="myParams" path="/myhandler,/root/*,/root1/**">
  <lst name="defaults">
    <str name="fl">_text_</str>
  </lst>
  <lst name="invariants">
    <str name="rows">10</str>
  </lst>
  <lst name="appends">
    <str name="df">title</str>
  </lst>
</initParams>

我們在範例的第一行中定義了三個路徑。

  • /myhandler 宣告為直接路徑。

  • /root/* 使用單個星號表示參數應適用於深度為一層的路徑。

  • /root1/** 使用雙星號表示參數應適用於所有巢狀路徑,無論深度如何。

當我們定義請求處理器時,萬用字元將以以下方式運作:

<requestHandler name="/myhandler" class="SearchHandler"/>

/myhandler 類別在 <initParams> 中被命名為路徑,因此將使用這些參數。

接下來,我們有一個名為 /root/search5 的請求處理器。

<requestHandler name="/root/search5" class="SearchHandler"/>

我們為深度比 /root 深一層的巢狀路徑定義了一個萬用字元,因此此請求處理器將使用這些參數。但是,此請求處理器不會使用參數,因為 /root/search5/test 的深度比 /root 深一層以上。

<requestHandler name="/root/search5/test" class="SearchHandler"/>

如果我們要定義所有層級的巢狀路徑,我們應該使用雙星號,如範例路徑 /root1/** 中所示。

<requestHandler name="/root1/search/tests" class="SearchHandler"/>

/root1 下的任何路徑,無論是否在請求處理器中明確定義,都將使用相符 initParams 區段中定義的參數。