Solr配置API:Config API
Config API可以使用类似REST的API调用来处理您的solrconfig.xml的各个方面。
此功能默认启用,并且在SolrCloud和独立模式下的工作方式类似。许多通常编辑的属性(如缓存大小和提交设置)和请求处理程序定义可以使用此API进行更改。
使用此API时,solrconfig.xml不会更改。相反,所有编辑的配置都存储在一个名为configoverlay.json的文件中。该configoverlay.json中值覆盖solrconfig.xml中的值。
配置API入口点
- /config:检索或修改配置。GET检索和POST执行命令
- /config/overlay:单独检索configoverlay.json细节
- /config/params:允许创建参数集,可以覆盖或取代在solrconfig.xml中定义的参数。请参阅请求参数API部分以获取更多详细信息。
检索配置
所有配置项,都可以通过向/config端点发送GET请求被检索 - 其结果将是configoverlay.json 与在 solrconfig.xml 中合并设置而产生的有效配置:
curl http://localhost:8983/solr/techproducts/config
如果要将返回的结果限制到顶级部分,例如query,requestHandler或者updateHandler,那么请将该节的名称追加到斜线之后的/config端点。例如,检索所有请求处理程序的配置:
curl http://localhost:8983/solr/techproducts/config/requestHandler
为了进一步限制返回的结果为顶层部分中的单个组件,请使用componentName请求参数,例如返回/select请求处理程序的配置:
curl http://localhost:8983/solr/techproducts/config/requestHandler?componentName=/select
修改配置的命令
此API使用特定的命令来告诉Solr要添加到configoverlay.json的属性或类型的属性。这些命令作为与请求一起发送的数据的一部分传递。
配置命令分为3个不同的部分,它们在 solrconfig. xml 中操作各种数据结构,这些都在下面的内容中进行描述。
- 通用属性
- 组件
- 用户定义的属性
通用属性的命令
常见的属性是那些经常需要在Solr实例中自定义的属性。它们使用两个命令进行操作:
- set-property:设置一个众所周知的属性。属性的名称是预定义的并且是固定的。如果该属性已经设置,该命令将覆盖以前的设置。
- unset-property:使用该set-property命令删除一个属性集。
使用这些命令配置的属性是预定义的,并在下面列出。这些属性的名称是从它们在 solrconfig. xml 中找到的 xml 路径派生的。
- updateHandler.autoCommit.maxDocs
- updateHandler.autoCommit.maxTime
- updateHandler.autoCommit.openSearcher
- updateHandler.autoSoftCommit.maxDocs
- updateHandler.autoSoftCommit.maxTime
- updateHandler.commitWithin.softCommit
- updateHandler.indexWriter.closeWaitsForMerges
- query.filterCache.class
- query.filterCache.size
- query.filterCache.initialSize
- query.filterCache.autowarmCount
- query.filterCache.regenerator
- query.queryResultCache.class
- query.queryResultCache.size
- query.queryResultCache.initialSize
- query.queryResultCache.autowarmCount
- query.queryResultCache.regenerator
- query.documentCache.class
- query.documentCache.size
- query.documentCache.initialSize
- query.documentCache.autowarmCount
- query.documentCache.regenerator
- query.fieldValueCache.class
- query.fieldValueCache.size
- query.fieldValueCache.initialSize
- query.fieldValueCache.autowarmCount
- query.fieldValueCache.regenerator
- query.useFilterForSortedQuery
- query.queryResultWindowSize
- query.queryResultMaxDocCached
- query.enableLazyFieldLoading
- query.boolToFilterOptimizer
- query.maxBooleanClauses
- jmx.agentId
- jmx.serviceUrl
- jmx.rootName
- requestDispatcher.handleSelect
- requestDispatcher.requestParsers.multipartUploadLimitInKB
- requestDispatcher.requestParsers.formdataUploadLimitInKB
- requestDispatcher.requestParsers.enableRemoteStreaming
- requestDispatcher.requestParsers.addHttpRequestToContext
自定义处理程序和本地组件的命令
自定义请求处理程序、搜索组件和其他类型的本地化Solr组件(例如自定义查询解析器、更新处理器等)可以使用特定命令添加、更新和删除,以便修改组件。
语法在每种情况下都是类似的:add-<component-name>,update-<component-name>,和delete-<component-name>。命令名不区分大小写,因此Add-RequestHandler,ADD-REQUESTHANDLER和add-requesthandler都是等效的。
在每种情况下,add- 命令都会将新配置添加到configoverlay.json,这将覆盖solrconfig.xml组件中的任何其他设置;update- 命令覆盖configoverlay.json中的现有设置;delete-命令从configoverlay.json中删除设置。
从configoverlay.json删除的设置不会从solrconfig.xml中删除。
可用命令的完整列表如下所示:
这些命令是最常用的:
- add-requesthandler
- update-requesthandler
- delete-requesthandler
- add-searchcomponent
- update-searchcomponent
- delete-searchcomponent
- add-initparams
- update-initparams
- delete-initparams
- add-queryresponsewriter
- update-queryresponsewriter
- delete-queryresponsewriter
这些命令允许向Solr注册更高级的定制:
- add-queryparser
- update-queryparser
- delete-queryparser
- add-valuesourceparser
- update-valuesourceparser
- delete-valuesourceparser
- add-transformer
- update-transformer
- delete-transformer
- add-updateprocessor
- update-updateprocessor
- delete-updateprocessor
- add-queryconverter
- update-queryconverter
- delete-queryconverter
- add-listener
- update-listener
- delete-listener
- add-runtimelib
- update-runtimelib
- delete-runtimelib
有关使用这些命令的示例,请参见下面的“创建和更新请求处理程序”一节。
什么是updateRequestProcessorChain?
配置API不允许您创建或编辑updateRequestProcessorChain元素。但是,可以创建updateProcessor条目并按名称使用它们来创建链。
例如:
curl http://localhost:8983/solr/techproducts/config -H 'Content-type:application/json' -d '{
"add-updateprocessor" : { "name" : "firstFld",
"class": "solr.FirstFieldValueUpdateProcessorFactory",
"fieldName":"test_s"}}'
您可以直接在您的请求中使用此功能,方法是在updateRequestProcessorChain中的特定更新处理器中添加一个名为processor=firstFld的参数。
用户定义属性的命令
Solr允许用户使用占位符格式:${variable_name:default_val}对solrconfig.xml进行模板化。例如,您可以使用系统属性,如:-Dvariable_name= my_customvalue来设置这些值。使用这些命令可以在运行时实现相同的功能:
- set-user-property:设置用户定义的属性。如果该属性已经设置,则该命令将覆盖以前的设置。
- unset-user-property:删除用户定义的属性。
请求的结构类似于使用其他命令的请求的结构,格式为"command":{"variable_name":"property_value"}。如有需要,您可以一次添加多个变量。
有关用户定义属性的更多信息,请参阅core.properties中的“用户定义属性”部分。
有关如何使用此类型命令的示例,另请参阅下面的“创建和更新用户定义的属性”部分。
如何将solrconfig.xml属性映射到JSON
通过使用此API,您将生成在solrconfig.xml中定义的属性的JSON表示。为了理解API如何表示属性,我们来看几个例子。
以下是一个请求处理程序在 solrconfig 中的样子:
<requestHandler name="/query" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</str>
</lst>
</requestHandler>
使用Config API定义的相同请求处理程序如下所示:
{
"add-requesthandler":{
"name":"/query",
"class":"solr.SearchHandler",
"defaults":{
"echoParams":"explicit",
"rows": 10
}
}
}
solrconfig.xml中的QueryElevationComponent searchComponent 如下所示:
<searchComponent name="elevator" class="solr.QueryElevationComponent" >
<str name="queryFieldType">string</str>
<str name="config-file">elevate.xml</str>
</searchComponent>
与Config API相同的 searchComponent:
{
"add-searchcomponent":{
"name":"elevator",
"class":"QueryElevationComponent",
"queryFieldType":"string",
"config-file":"elevate.xml"
}
}
使用Config API删除searchComponent:
{
"delete-searchcomponent":"elevator"
}
一个简单的高亮在solrconfig.xml中看起来是像下面这样(例如被截断的空间):
<searchComponent class="solr.HighlightComponent" name="highlight">
<highlighting>
<fragmenter name="gap"
default="true"
class="solr.highlight.GapFragmenter">
<lst name="defaults">
<int name="hl.fragsize">100</int>
</lst>
</fragmenter>
<formatter name="html"
default="true"
class="solr.highlight.HtmlFormatter">
<lst name="defaults">
<str name="hl.simple.pre"><![CDATA[<em>]]></str>
<str name="hl.simple.post"><![CDATA[</em>]]></str>
</lst>
</formatter>
<encoder name="html" class="solr.highlight.HtmlEncoder" />
...
</highlighting>
与Config API相同的高亮:
{
"add-searchcomponent": {
"name": "highlight",
"class": "solr.HighlightComponent",
"": {
"gap": {
"default": "true",
"name": "gap",
"class": "solr.highlight.GapFragmenter",
"defaults": {
"hl.fragsize": 100
}
}
},
"html": [{
"default": "true",
"name": "html",
"class": "solr.highlight.HtmlFormatter",
"defaults": {
"hl.simple.pre": "before-",
"hl.simple.post": "-after"
}
}, {
"name": "html",
"class": "solr.highlight.HtmlEncoder"
}]
}
}
在solrconfig.xml以下位置设置autoCommit属性:
<autoCommit>
<maxTime>15000</maxTime>
<openSearcher>false</openSearcher>
</autoCommit>
使用Config API定义相同的属性:
{
"set-property": {
"updateHandler.autoCommit.maxTime":15000,
"updateHandler.autoCommit.openSearcher":false
}
}
为Config API的组件命名
Config API始终允许通过名称更改任何组件的配置。然而,一些配置,如listener或initParams不需要 solrconfig. xml 中的名称。为了能够update和delete在configoverlay.json中相同的项目,必须使用 name 属性。
Config API示例
创建和更新通用属性
此更改将 query.filterCache.autowarmCount 设置为1000项,并取消设置 query.filterCache.size。
curl http://localhost:8983/solr/techproducts/config -H 'Content-type:application/json' -d'{
"set-property" : {"query.filterCache.autowarmCount":1000},
"unset-property" :"query.filterCache.size"}'
使用/config/overlay端点,您可以使用如下请求验证更改:
curl http://localhost:8983/solr/gettingstarted/config/overlay?omitHeader=true
您应该会得到这样的回应:
{
"overlay":{
"znodeVersion":1,
"props":{"query":{"filterCache":{
"autowarmCount":1000,
"size":25}}}}}
创建和更新请求处理程序
要创建请求处理程序,我们可以使用以下add-requesthandler命令:
curl http://localhost:8983/solr/techproducts/config -H 'Content-type:application/json' -d '{
"add-requesthandler" : {
"name": "/mypath",
"class":"solr.DumpRequestHandler",
"defaults":{ "x":"y" ,"a":"b", "rows":10 },
"useParams":"x"
}
}'
调用新的请求处理程序来检查它是否被注册:
curl http://localhost:8983/solr/techproducts/mypath?omitHeader=true
您应该会看到下面的输出:
{
"params":{
"indent":"true",
"a":"b",
"x":"y",
"rows":"10"},
"context":{
"webapp":"/solr",
"path":"/mypath",
"httpMethod":"GET"}}
要更新请求处理程序,您应该使用以下update-requesthandler命令:
curl http://localhost:8983/solr/techproducts/config -H 'Content-type:application/json' -d '{
"update-requesthandler": {
"name": "/mypath",
"class":"solr.DumpRequestHandler",
"defaults": {"x":"new value for X", "rows":"20"},
"useParams":"x"
}
}'
作为另一个例子,我们将创建另一个请求处理程序,这次将“terms”组件添加为定义的一部分:
curl http://localhost:8983/solr/techproducts/config -H 'Content-type:application/json' -d '{
"add-requesthandler": {
"name": "/myterms",
"class":"solr.SearchHandler",
"defaults": {"terms":true, "distrib":false},
"components": [ "terms" ]
}
}'
创建和更新用户定义的属性
这个命令设置一个用户属性。
curl http://localhost:8983/solr/techproducts/config -H'Content-type:application/json' -d '{
"set-user-property" : {"variable_name":"some_value"}}'
我们依然可以使用/config/overlay端点来验证所做的更改:
curl http://localhost:8983/solr/techproducts/config/overlay?omitHeader=true
我们希望看到这样的输出:
{"overlay":{
"znodeVersion":5,
"userProps":{
"variable_name":"some_value"}}
}
要取消设置变量,请执行如下命令:
curl http://localhost:8983/solr/techproducts/config -H'Content-type:application/json' -d '{"unset-user-property" : "variable_name"}'
Config API的工作原理
每个内核都监视与该内核一起使用的配置集的ZooKeeper目录。然而,在独立模式下,没有监视(因为ZooKeeper没有运行)。如果同一个节点中有多个核心使用相同的配置集,则只使用一个ZooKeeper监视。例如,如果一个核心使用了configset'myconf',那么节点就会监视/configs/myconf。每个通过API执行的写入操作都会“触摸”目录(设置一个空字节[]来触发监视),并通知所有监视器。每个内核会检查Schema文件,solrconfig.xml或者configoverlay.json通过比较znode版本进行修改,如果修改,则重新加载内核。
如果params.json修改,则params对象只是在没有核心重新加载的情况下更新(请参阅请求参数API部分了解更多有关params.json的信息)。
空命令
如果一个空的命令发送到/config端点,那么使用这个配置集在所有内核上触发监视。例如:
curl http://localhost:8983/solr/techproducts/config -H'Content-type:application/json' -d '{}'
直接编辑任何文件而不“接触”该目录将不会使其对所有节点可见。
通过SolrCore#registerConfListener()注册监听器,组件可以监视configset “touch”事件。
听取配置更改
任何组件都可以使用以下方法注册侦听器
SolrCore#addConfListener(Runnable listener)
通知配置更改。如果修改的文件导致核心重新加载(即configoverlay.xml或架构),这不是非常有用。组件可以使用它来重新加载他们感兴趣的文件。