请求参数 API

请求参数 API 允许创建参数集,也称为 paramset,它可以覆盖或取代在 solrconfig.xml 中定义的参数。

使用此 API 定义的参数集可以在对 Solr 的请求中使用,也可以直接在 solrconfig.xml 请求处理程序定义中引用。

它实际上是 配置 API 的另一个端点,而不是一个单独的 API,并且具有不同的命令。它不会替换或修改 solrconfig.xml 的任何部分,而是提供了另一种处理请求中使用的参数的方法。它的行为方式与配置 API 相同,通过将参数存储在另一个文件中,该文件将在运行时使用。在这种情况下,参数存储在名为 params.json 的文件中。当运行 SolrCloud 时,此文件保存在 ZooKeeper 中,或者在用户管理集群或单节点安装的 conf 目录中。

如以下所述,存储在 params.json 中的设置在查询时使用,以覆盖在某些情况下在 solrconfig.xml 中定义的设置。

何时可能需要使用此功能?

  • 避免频繁编辑 solrconfig.xml 以更新经常更改的请求参数。

  • 在各种请求处理程序之间重用参数。

  • 在请求时混合和匹配参数集。

  • 避免因小的参数更改而重新加载集合。

请求参数端点

所有请求都发送到配置 API 的 /config/params 端点。

配置请求参数

设置或更新请求参数的请求作为一组具有名称的映射发送。这些对象可以直接在请求或请求处理程序定义中使用。删除参数集的请求作为名称列表或名称发送。

可用的命令是

  • set: 创建或覆盖参数集映射。

  • delete: 删除请求参数集映射。

  • update: 更新参数集映射。这等效于 map.putAll(newMap)。两个映射被合并,如果新映射与旧映射具有相同的键,则会被覆盖。

如有必要,您可以将这些命令混合到单个请求中。

对于 setupdate 命令,每个映射必须包含一个名称,以便稍后可以在直接对 Solr 的请求或请求处理程序定义中引用它。

在以下示例中,我们设置了 2 组名为 'myFacets' 和 'myQueries' 的参数。

curl https://127.0.0.1:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "set":{
    "myFacets":{
      "facet":"true",
      "facet.limit":5}},
  "set":{
    "myQueries":{
      "defType":"edismax",
      "rows":"5",
      "df":"text_all"}}
}'

在上面的示例中,所有参数都等效于 solrconfig.xml 中的“defaults”。可以添加 invariants 和 appends,如下所示

curl https://127.0.0.1:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "set":{
    "my_handler_params":{
      "facet.limit":5,
      "_invariants_": {
        "facet":true,
       },
      "_appends_":{"facet.field":["field1","field2"]
     }
   }}
}'

在以下示例中,删除了两组名为“myFacets”和“myQueries”的参数。

curl https://127.0.0.1:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "delete":[
    "myFacets",
    "myQueries"
  ]
}'

当删除单个参数集时,该值可以指定为字符串而不是列表。

curl https://127.0.0.1:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "delete":"myFacets"
}'

将请求参数与请求处理程序一起使用

在上一节中创建了 my_handler_params 参数集后,可以按如下方式定义请求处理程序

<requestHandler name="/my_handler" class="solr.SearchHandler" useParams="my_handler_params"/>

它将等效于标准的请求处理程序定义,例如

<requestHandler name="/my_handler" class="solr.SearchHandler">
  <lst name="defaults">
    <int name="facet.limit">5</int>
  </lst>
  <lst name="invariants">
    <bool name="facet">true</bool>
  </lst>
  <lst name="appends">
    <arr name="facet.field">
      <str>field1</str>
      <str>field2</str>
    </arr>
  </lst>
</requestHandler>

使用请求参数 API 的隐式请求处理程序

Solr 附带了许多开箱即用的请求处理器,这些处理器可能只能通过请求参数 API 进行配置,因为它们的配置不存在于 solrconfig.xml 中。请参阅 隐式请求处理器,了解在配置隐式请求处理器时使用的参数集。

使用请求处理器查看展开的参数集和有效参数

要查看使用 useParams 定义的 RequestHandler 的展开参数集和生成的有效参数,请使用 expandParams 请求参数。例如,对于 /export 请求处理器:

$ curl https://127.0.0.1:8983/solr/techproducts/config/requestHandler?componentName=/export&expandParams=true

查看请求参数

要查看已创建的参数集,可以使用 /config/params 端点读取 params.json 的内容,或者在请求中使用名称:

$ curl https://127.0.0.1:8983/solr/techproducts/config/params

#Or use the paramset name
$ curl https://127.0.0.1:8983/solr/techproducts/config/params/myQueries

useParams 参数

发出请求时,useParams 参数会应用发送到请求的请求参数。这会在请求时转换为实际的参数。

例如(使用我们在前面的示例中设置的名称,请替换为您自己的名称):

https://127.0.0.1/solr/techproducts/select?useParams=myQueries

可以在同一个请求中传递多个参数集。例如:

https://127.0.0.1/solr/techproducts/select?useParams=myFacets,myQueries

在上面的示例中,参数集“myQueries”应用于“myFacets”之上。因此,“myQueries”中的值优先于“myFacets”中的值。此外,请求中传递的任何值都优先于 useParams 参数。这就像 solrconfig.xml<requestHandler> 定义中指定的“默认值”。

参数集可以直接在请求处理器定义中使用,如下所示。请注意,即使请求包含 useParams,指定的 useParams 始终会应用。

<requestHandler name="/terms" class="solr.SearchHandler" useParams="myQueries">
  <lst name="defaults">
    <bool name="terms">true</bool>
    <bool name="distrib">false</bool>
  </lst>
  <arr name="components">
    <str>terms</str>
  </arr>
</requestHandler>

总而言之,参数按以下顺序应用:

  • solrconfig.xml<invariants> 中定义的参数。

  • params.jsoninvariants 中应用,并在请求处理器定义甚至单个请求中指定的参数。

  • 直接在请求中定义的参数。

  • 在请求中定义的参数集,按照它们使用 useParams 列出的顺序排列。

  • 在请求处理器中定义的 params.json 中定义的参数集。

  • solrconfig.xml<defaults> 中定义的参数。

公共 API

可以使用 SolrConfig#getRequestParams() 方法访问 RequestParams 对象。可以使用 RequestParams#getRequestParams(String name) 方法通过它们的名称访问每个参数集。

使用请求参数 API 的示例

Solr “films”示例演示了参数 API 的用法。您可以在 Solr 安装中(在 example/films 目录中)使用此示例,或在 Solr GitHub 镜像中查看文件:https://github.com/apache/solr/tree/main/solr/example/films