升级Solr后如何忽略请求中的未知自定义参数以保持兼容?
解决Solr升级后忽略未知JSON顶级参数的问题
嘿,刚好碰到过类似的向后兼容问题,给你两个靠谱的配置方案,不用折腾代码就能搞定:
方案1:用Solr原生参数(推荐,适合Solr 8.10+)
从Solr 8.10版本开始,官方专门提供了参数来忽略JSON请求里的未知顶级键,直接在solrconfig.xml里配置默认值就行:
- 打开你的
solrconfig.xml,找到对应的请求处理器(比如/select查询接口或者/update/json更新接口,看你实际用的是哪个) - 在处理器的
<defaults>节点里添加这个参数:
<requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <!-- 保留你原有的其他默认参数,比如q、rows之类的 --> <bool name="json.ignore.unknown.top.level.keys">true</bool> </lst> <!-- 其他原有配置 --> </requestHandler>
如果想让所有请求都生效,也可以直接在全局的<defaults>节点里设置:
<defaults> <bool name="json.ignore.unknown.top.level.keys">true</bool> </defaults>
保存配置后重启Solr,旧请求里的customParam就会被自动忽略,不会再抛出Unknown top-level key的异常了。
方案2:自定义请求处理器脚本(适合低版本Solr)
如果你的Solr版本低于8.10,那可以用ScriptUpdateProcessor写个简单的Groovy脚本过滤掉未知的顶级键:
- 在
solrconfig.xml里添加一个自定义的请求处理器链:
<updateRequestProcessorChain name="ignore-custom-top-keys"> <processor class="solr.ScriptUpdateProcessorFactory"> <str name="script">ignore_custom_keys.groovy</str> </processor> <!-- 保留后续的默认处理器,比如日志和更新处理器 --> <processor class="solr.LogUpdateProcessorFactory"/> <processor class="solr.RunUpdateProcessorFactory"/> </updateRequestProcessorChain>
- 在Solr的
conf/scripts目录下创建ignore_custom_keys.groovy脚本,内容如下:
def processUpdate(cmd) { // 定义你允许的顶级键列表,根据实际业务需求调整 def allowedTopKeys = ["q", "fq", "fl", "sort", "start", "rows", "wt", "indent", "query"] // 获取当前请求的所有顶级键 def currentKeys = cmd.solrInputDocument.keySet() // 移除不在允许列表里的自定义键 currentKeys.each { key -> if (!allowedTopKeys.contains(key)) { cmd.solrInputDocument.remove(key) } } return cmd }
- 把这个处理器链绑定到你的目标请求处理器上,比如:
<requestHandler name="/update/json" class="solr.UpdateRequestHandler"> <lst name="defaults"> <str name="update.chain">ignore-custom-top-keys</str> </lst> </requestHandler>
重启Solr后,脚本会自动过滤掉不在允许列表里的自定义参数,实现向后兼容。
记得根据你实际使用的接口(查询还是更新)调整对应的处理器配置,旧客户端的请求就能正常工作啦!
内容的提问来源于stack exchange,提问作者user1854458
相关产品推荐
相关产品推荐

