Solr从7.7升级至9.4后Boost功能失效问题求助
问题根源
你的查询被拆成了text:boost、text:b等单个分词项,说明Solr没有识别出{!boost}是本地参数(LocalParams)语法,而是把整个字符串当成普通查询文本直接分词了。这大概率是因为当前使用的查询解析器不支持LocalParams,或者Solr 9.x对语法的校验规则有变化。
具体解决步骤
1. 显式指定支持LocalParams的解析器
Solr 9.x默认的查询解析器可能不是lucene或edismax(这两个才支持LocalParams语法),可以直接在查询中指定:
q={!lucene boost=recip(ms(NOW,created),3.16e-11,1,0.1)}sorlrocks
或者用edismax的bq参数(更推荐,语法更清晰):
q=sorlrocks&bq=recip(ms(NOW,created),3.16e-11,1,0.1)^1.0
2. 修正Request Handler的默认解析器
如果不想每次查询都指定解析器,修改solrconfig.xml中对应request handler(比如/select)的defType配置,确保默认用支持LocalParams的解析器:
<requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <str name="defType">lucene</str> <!-- 换成edismax也可以 --> <!-- 其他默认参数 --> </lst> </requestHandler>
3. 验证字段类型兼容性
确认created字段是date或pdate类型,ms()函数只能处理日期类型字段,如果是字符串类型,函数无法计算时间差,会导致解析失败,进而触发默认分词行为。检查managed-schema或schema.xml:
<field name="created" type="date" indexed="true" stored="true"/>
4. 检查语法格式兼容性
Solr 9.x对函数语法的校验更严格,尝试把3.16e-11改成大写3.16E-11,部分版本对科学计数法的大小写有要求:
q={!lucene boost=recip(ms(NOW,created),3.16E-11,1,0.1)}sorlrocks
验证方式
修改后在Solr Admin执行查询,查看parsedquery_toString是否显示为预期的FunctionScoreQuery结构。如果还是有问题,开启Solr的DEBUG日志(设置log4j.logger.org.apache.solr.search=DEBUG),查看解析过程中的错误信息,定位具体问题。
内容的提问来源于stack exchange,提问作者gherosh

