ElasticSearch实现忽略空格与大小写的姓氏排序需求
解决ElasticSearch姓氏排序忽略大小写与空格的问题
方案1:使用Runtime Field(无需重新索引现有数据)
直接在查询中定义临时标准化字段,处理姓氏的空格与大小写,基于该字段排序:
{ "size": 10, "query": { "bool": { "adjust_pure_negative": true, "boost": 1.0 } }, "runtime_mappings": { "last_name_normalized": { "type": "keyword", "script": """ String normalized = doc['last_name'].value.replaceAll("\\s+", "").toLowerCase(); emit(normalized); """ } }, "sort": [{ "last_name_normalized": { "order": "desc" } }] }
该方法会将last_name的值去掉所有空格、转为小写,用标准化后的值排序,确保Z开头的条目在降序结果中排首位。
方案2:修改索引Mapping(需重新索引数据,性能更优)
如果允许重新索引数据,建议给last_name设置多字段,用自定义分析器预处理排序字段:
第一步:创建带自定义分析器的索引
PUT /users { "settings": { "analysis": { "analyzer": { "last_name_sort_analyzer": { "tokenizer": "keyword", "filter": [ "lowercase", "trim", "remove_spaces_filter" ] } }, "filter": { "remove_spaces_filter": { "type": "pattern_replace", "pattern": "\\s+", "replacement": "" } } } }, "mappings": { "properties": { "last_name": { "type": "text", "fields": { "sort": { "type": "text", "analyzer": "last_name_sort_analyzer", "fielddata": true } } }, "first_name": { "type": "text" } } } }
第二步:使用标准化字段排序
{ "size": 10, "query": { "bool": { "adjust_pure_negative": true, "boost": 1.0 } }, "sort": [{ "last_name.sort": { "order": "desc" } }] }
自定义分析器会自动去掉姓氏中的所有空格、转为小写,排序时直接使用预处理后的last_name.sort字段,性能比Runtime Field更适合长期使用。
内容的提问来源于stack exchange,提问作者Nane Petrosyan
相关产品推荐
相关产品推荐

