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
區段中定義的參數。