请求参数 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` 以更新经常更改的请求参数。
-
在各种请求处理程序中重复使用参数。
-
在请求时混合匹配参数集。
-
避免对小型参数更改重新加载集合。
配置请求参数
设置或更新请求参数的请求作为一组具有名称的映射发送。这些对象可以直接在请求或请求处理程序定义中使用。删除参数集的请求作为名称或名称列表发送。
可用的命令是
-
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。
查看请求参数
要查看已创建的 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.json
中invariants
中应用的参数在请求处理程序定义中指定,甚至在单个请求中指定。 -
直接在请求中定义的参数。
-
按照使用
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 镜像中的文件。