Elasticsearch结合IK分词器:如何保留含特殊字符的完整分词?
解决方案:无需开发自定义插件
可以通过自定义分析器+字符过滤器+IK分词器的组合实现需求,具体步骤如下:
1. 配置自定义字符过滤器,锁定需完整保留的特殊字符串
创建mapping类型的字符过滤器,将foo(bar)这类目标字符串替换为临时标记(避免被IK分词器拆分),后续再还原:
{ "settings": { "analysis": { "char_filter": { "mark_special_str": { "type": "mapping", "mappings": [ "foo(bar) => _foo_bar_" ] }, "restore_special_str": { "type": "mapping", "mappings": [ "_foo_bar_ => foo(bar)" ] } } } } }
2. 组合字符过滤器与IK分词器,构建自定义分析器
将上述字符过滤器与ik_smart分词器结合,同时加入同义词过滤器(如果需要):
{ "settings": { "analysis": { "char_filter": { "mark_special_str": { "type": "mapping", "mappings": [ "foo(bar) => _foo_bar_" ] }, "restore_special_str": { "type": "mapping", "mappings": [ "_foo_bar_ => foo(bar)" ] } }, "filter": { "custom_synonym": { "type": "synonym", "synonyms": [ "abc => _foo_bar_" ] } }, "analyzer": { "custom_ik": { "type": "custom", "char_filter": ["mark_special_str"], "tokenizer": "ik_smart", "filter": ["lowercase", "custom_synonym", "restore_special_str"] } } } }, "mappings": { "properties": { "name": { "type": "text", "analyzer": "custom_ik", "fields": { "keyword": { "type": "keyword" } } } } } }
3. 验证效果
- 输入
i want a foo(bar)时,会保留完整的foo(bar)分词;中文弹性搜索很厉害会被正确拆分为['弹性', '搜索', '很', '厉害'] - 搜索
abc时,同义词转换为临时标记_foo_bar_,经IK分词后保留完整标记,最终还原为foo(bar),实现精确匹配
内容的提问来源于stack exchange,提问作者chouyangv3
相关产品推荐
相关产品推荐

