如何让Elasticsearch的word_delimiter_graph仅按指定分隔符拆分?
实现仅按指定分隔符拆分的类word_delimiter_graph分词效果
要实现仅按-拆分令牌且保留原词的需求,你可以通过组合Elasticsearch的多个内置分词过滤器来完成,具体配置如下:
自定义分词器配置
首先创建包含自定义分析器的索引:
PUT /hyphen_split_index { "settings": { "analysis": { "filter": { "hyphen_capture_filter": { "type": "pattern_capture", "preserve_original": true, "patterns": [ "(.*?)-", "-(.+)" ] }, "trim_empty": { "type": "trim" }, "deduplicate": { "type": "unique", "only_on_same_position": true } }, "analyzer": { "hyphen_splitter": { "type": "custom", "tokenizer": "keyword", "filter": [ "hyphen_capture_filter", "trim_empty", "deduplicate" ] } } } } }
配置说明
keyword令牌生成器:将整个输入文本作为单个令牌输出,确保原词(如i-pod)被完整保留。hyphen_capture_filter模式捕获过滤器:preserve_original: true保留原始令牌- 正则
(.*?)-捕获-左侧的所有内容,-(.+)捕获-右侧的所有内容,以此拆分出子令牌
trim_empty修剪过滤器:清理可能出现的空令牌(例如输入文本以-开头/结尾的场景)deduplicate去重过滤器:移除同一位置的重复令牌,避免冗余
测试效果
测试带-的文本
POST /hyphen_split_index/_analyze { "analyzer": "hyphen_splitter", "text": "i-pod" }
输出令牌:["i-pod", "i", "pod"],符合需求。
测试带_的文本
POST /hyphen_split_index/_analyze { "analyzer": "hyphen_splitter", "text": "i_pod" }
输出令牌:["i_pod"],未被拆分,符合预期。
扩展说明
如果需要支持多个指定分隔符(比如同时按-和|拆分),只需修改patterns中的正则表达式:
"patterns": [ "(.*?)([-|])", "([-|])(.+)" ]
内容的提问来源于stack exchange,提问作者Geoffrey
相关产品推荐
相关产品推荐

