Solr使用动态字段查询出现undefined field错误如何规避
问题原因
你遇到的报错是因为Solr默认配置下,查询时引用的字段如果没有被任何现有文档实际使用过(哪怕匹配动态字段规则),也会被判定为未定义字段抛出错误。
解决方案
以下方案都不需要预先调用Schema接口校验字段:
方案1:请求参数添加忽略未定义字段配置
直接在你的查询请求中增加参数 ignoreUndefinedFields=true 即可。
开启该参数后,查询遇到不存在的removed_${uuid}字段时不会抛出错误,你的负向查询-removed_${uuid}:[0 TO *]会自动匹配所有文档(因为不存在的字段没有匹配结果,取反后就是全量文档),完全符合你需要筛选「对应removed字段不存在」的需求。
示例请求参数片段:
q=*:*&fq=-removed_65bc705e-2bf7-4ba5-8809-bf84e8538e62:[* TO *]&ignoreUndefinedFields=true
提示:pdate类型的范围查询用[* TO *]代替[0 TO *]兼容性更好
方案2:全局默认开启忽略未定义字段
如果所有查询都需要这个逻辑,可以直接修改solrconfig.xml中你使用的查询解析器配置,添加默认参数:
<requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <bool name="ignoreUndefinedFields">true</bool> <!-- 其他原有默认配置 --> </lst> </requestHandler>
配置后所有/select接口的请求默认都会忽略未定义字段,不需要每次传参。
方案3:使用exists语法简化查询
你也可以把原来的字段存在性校验改为用Solr内置的exists()函数写法,逻辑更直观,搭配ignoreUndefinedFields同样可以正常工作:
fq=-exists(removed_${uuid})
内容的提问来源于stack exchange,提问作者d-_-b
相关产品推荐
相关产品推荐

