请求参数 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)`。两个映射都将合并,如果新映射具有与旧映射相同的键,则将覆盖它们。

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

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

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

curl http://localhost: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 http://localhost: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 http://localhost:8983/solr/techproducts/config/params -H 'Content-type:application/json'  -d '{
  "delete":[
    "myFacets",
    "myQueries"
  ]
}'

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

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

使用 RequestHandlers 的请求参数

在上述部分中创建 my_handler_params paramset 后,可以按如下方式定义请求处理程序

<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 的隐式 RequestHandlers

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

使用 RequestHandlers 查看扩展的 Paramsets 和有效参数

要查看使用 useParams 定义的 RequestHandler 的扩展 paramset 和结果有效参数,请使用 expandParams 请求参数。例如,对于 /export 请求处理程序

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

查看请求参数

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

$ curl http://localhost:8983/solr/techproducts/config/params

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

UseParams 参数

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

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

http://localhost/solr/techproducts/select?useParams=myQueries

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

http://localhost/solr/techproducts/select?useParams=myFacets,myQueries

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

参数集可以直接在请求处理程序定义中使用,如下所示。请注意,即使请求包含 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 目录中)中使用此示例,或在 https://github.com/apache/solr/tree/main/solr/example/films 上查看 Solr GitHub 镜像中的文件。