Solr中FieldLengthFeature返回错误字段长度问题排查求助
嘿,我碰到过类似的坑——你配置的FieldLengthFeature返回的数值完全不符合预期,比如那个标题“Welcome to The Apache Software Foundation!”的长度你算的是5,但结果给了455.1111,这根本不是字符或Token数量,问题出在你误解了这个Feature的实际作用。
问题根源
别被FieldLengthFeature的名字误导了,它不是用来返回字段的字符长度或者Token数量的。这个Feature的核心逻辑是返回Solr索引阶段计算的字段归一化长度的倒数,基于字段的norm值计算而来。
具体来说,它的计算逻辑是1 / sqrt(字段的Token数量),但这个值会被Solr的索引归一化规则放大(比如和字段的boost、索引时的长度归一化参数有关),所以你看到的455.1111是经过归一化处理后的数值,和你预期的实际长度完全不是一回事。
解决办法
如果你确实需要获取标题的实际长度(字符数或Token数),有两个实用方案:
方案1:用Solr内置的Function Query直接计算
不想折腾自定义代码的话,直接用Function Query就能搞定:
- 要字符长度:用
strlen(title),直接返回字段值的字符数 - 要Token数量:用
termfreq(title, '*'),但前提是你的title字段在schema里开启了TermVector(termVectors="true")
修改后的查询命令可以改成这样:
curl -g 'http://localhost:8983/solr/nutch/select?indent=on&q=python&wt=json&fl=title,score,strlen(title) as titleLength'
方案2:自定义LTR Feature
如果一定要用LTR框架来返回长度值,你可以自己实现一个Feature类,在查询阶段加载字段内容,统计字符数或者Token数。比如核心逻辑可以是从文档中取出title字段的值,调用length()方法,或者通过TermVector获取Token数量。
额外检查点
如果想用termfreq(title, '*')获取Token数,先确认你的title字段配置:
<field name="title" type="text_general" indexed="true" stored="true" termVectors="true"/>
必须确保termVectors="true",否则这个函数会返回0或者不准确的值。
内容的提问来源于stack exchange,提问作者Vedanshu

