如何选择支持版本号范围比对查询的Solr字段类型?
Solr版本号对比字段类型实现方案
核心问题说明
Solr默认字符串字段按字典序排序比对,会出现2.17 < 2.7的错误判定:字典序比对时,两个版本号第一位都是2,第二位首位字符1 < 7,所以直接判定前者更小,不符合版本号语义比对规则。
推荐方案:自定义版本号字段类型
直接在managed-schema或schema.xml中定义专用的版本号字段类型,通过补零对齐版本号各段,让字典序和版本号序完全匹配。
字段类型配置
<!-- 版本号专用字段类型,支持范围查询和正确排序 --> <fieldType name="versionType" class="solr.TextField" sortMissingLast="true"> <analyzer type="index"> <!-- 把版本号每一段补零到4位,可根据业务最大段长度调整补零位数 --> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(^|\.)(\d{1})($|\.)" replacement="$1000$2$3"/> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(^|\.)(\d{2})($|\.)" replacement="$100$2$3"/> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(^|\.)(\d{3})($|\.)" replacement="$10$2$3"/> <tokenizer class="solr.KeywordTokenizerFactory"/> </analyzer> <analyzer type="query"> <!-- 查询侧做相同的补零处理,保证查询和索引规则一致 --> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(^|\.)(\d{1})($|\.)" replacement="$1000$2$3"/> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(^|\.)(\d{2})($|\.)" replacement="$100$2$3"/> <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="(^|\.)(\d{3})($|\.)" replacement="$10$2$3"/> <tokenizer class="solr.KeywordTokenizerFactory"/> </analyzer> </fieldType> <!-- 绑定到你的sdkVersion字段 --> <field name="sdkVersion" type="versionType" indexed="true" stored="true"/>
原理说明
补零后版本号各段长度一致:
2.7会被处理为0002.00072.17会被处理为0002.0017
此时字典序比对会正确识别2.17>2.7,完全符合版本号比对逻辑。
实现效果
配置完成后可直接执行原生范围查询,不需要额外的排除规则:sdkVersion: [3.0.0.0.1 TO 3.1.1.0]
查询返回结果和排序规则完全符合版本号语义要求。
内容的提问来源于stack exchange,提问作者Guy Mazouz
相关产品推荐
相关产品推荐

