如何在Elasticsearch中存储UTF-8字符并实现原样查询
Elasticsearch 全UTF-8特殊字符存储与精确匹配解决方案
核心思路是使用keyword类型定义目标字段,该类型不会对内容做任何分词、转义或字符过滤处理,原生支持完整UTF-8字符集存储,可实现和SQL中CHAR/VARCHAR字段一致的存储、精确匹配效果。
1. 索引映射配置
创建索引时将目标字段类型指定为keyword即可,示例配置如下:
PUT /your_target_index { "mappings": { "properties": { "content": { "type": "keyword", "index": true, "doc_values": true } } } }
参数说明:
type: keyword:不做任何分析处理,原样存储所有UTF-8字符,包括+、/、特殊符号、emoji等index: true:开启索引支持精确查询doc_values: true:开启列存储,加快查询取值速度,返回值为写入时的原始内容
2. 写入数据
写入时不需要对特殊字符做额外转义,直接传入原始UTF-8编码的内容即可:
PUT /your_target_index/_doc/1 { "content": "a+z///d" }
3. 精确匹配查询
使用term查询直接传入原始字符串作为条件,即可精确命中对应数据:
GET /your_target_index/_search { "query": { "term": { "content": "a+z///d" } } }
查询返回结果的_source字段中,content值和写入时的原始内容完全一致。
注意事项
- 禁止使用
text类型存储需要精确匹配的字段:默认text类型会经过分词器处理,+、/等特殊符号会被当成分隔符过滤,无法实现精确匹配 - 如果同时需要支持模糊搜索和精确匹配,可以配置多字段类型,同时保留
text子字段用于模糊搜索,keyword子字段用于精确匹配 - 若使用数据同步工具(Logstash/Beats等)写入数据,需手动覆盖自动生成的映射,避免字段被自动设为
text类型
内容的提问来源于stack exchange,提问作者divya
相关产品推荐
相关产品推荐

