如何配置Solr字符串字段实现不区分大小写的指定排序规则
实现Solr字符串字段的大小写交替排序
要搞定你需要的这种排序规则——先显示特殊字符、数字,然后按A、a、B、b……Z、z的顺序排列(替代原来Oracle那种大写全在前、小写全在后的逻辑),可以通过自定义Solr字段类型来实现,具体操作如下:
1. 定义自定义字段类型
在你的Solr schema配置文件(schema.xml或者managed-schema)里,添加一个专门用于这种排序的字段类型:
<fieldType name="string_case_alternate_sort" class="solr.TextField" sortMissingLast="true" omitNorms="true"> <analyzer type="index"> <tokenizer class="solr.KeywordTokenizerFactory"/> <!-- 用ICU排序规则生成排序键,确保大小写字母同组且大写在前 --> <filter class="solr.CollationKeyFilterFactory" locale="en_US" strength="primary" alternate="shifted" caseFirst="upper"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.KeywordTokenizerFactory"/> </analyzer> </fieldType>
这里的关键配置说明:
KeywordTokenizerFactory:把整个字符串当作单个token,适合不需要分词的字符串字段。CollationKeyFilterFactory:借助ICU的排序规则生成排序用的键,其中:strength="primary":让Solr将同一字母的大小写视为“同一级别”,确保它们排在一起。caseFirst="upper":指定同一字母的大写形式排在小写前面。locale="en_US":适配英文语言的排序逻辑,符合你的需求。
2. 应用自定义字段类型到目标字段
把你需要排序的字符串字段,修改为使用上面定义的新类型:
<field name="your_target_field" type="string_case_alternate_sort" indexed="true" stored="true"/>
注意:如果这个字段已经有数据,你需要重新索引所有数据,这样新的排序规则才能生效。
3. 使用该字段进行排序
在Solr查询时,直接指定用这个字段升序排序即可:
sort=your_target_field asc
这样配置后,你的搜索结果就会按照预期的顺序排列:数字、特殊字符在前,然后是ATest、aTest,接着BTest、bTest……以此类推。
如果你不想修改字段类型,也可以尝试用查询时的函数排序(不过性能不如提前索引好的方式),示例如下:
sort=collate(your_target_field, 'en_US', 'primary', 'upper') asc
内容的提问来源于stack exchange,提问作者Abhay
相关产品推荐
相关产品推荐

