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 部分中定义的参数。