如何在OpenSearch中定义保留指定分隔符为分词的分词器?
在OpenSearch中定义保留指定分隔符的分词器
要实现将lorem123+ipsum-dolar拆分为lorem123、+、ipsum、-、dolar的需求,你可以通过自定义分词器实现,核心是让指定分隔符既作为拆分依据,又被保留为独立分词。以下是具体实现步骤:
1. 创建带自定义分词器的索引
通过PUT请求创建索引,在settings中定义自定义tokenizer和analyzer:
PUT /symbol_aware_index { "settings": { "analysis": { "tokenizer": { // 自定义pattern分词器,匹配字母数字串或指定符号 "symbol_tokenizer": { "type": "pattern", "pattern": "([a-zA-Z0-9]+)|([+\\-])", "group": 0 } }, "analyzer": { // 组装自定义分词器 "symbol_preserving_analyzer": { "type": "custom", "tokenizer": "symbol_tokenizer", "filter": ["lowercase"] // 可选:按需添加大小写转换等过滤器 } } } }, "mappings": { "properties": { "content": { "type": "text", "analyzer": "symbol_preserving_analyzer" } } } }
关键参数说明
pattern正则表达式:([a-zA-Z0-9]+)|([+\\-])表示匹配两种内容:连续的字母数字序列,或者+/-符号。如果需要添加更多分隔符,只需在第二个分组中补充(比如添加*就改成([+\\-*]),注意转义正则特殊字符)。group: 0:表示将整个匹配结果作为独立token返回,确保符号被保留。
2. 验证分词效果
通过_analyze接口测试分词结果:
POST /symbol_aware_index/_analyze { "analyzer": "symbol_preserving_analyzer", "text": "lorem123+ipsum-dolar" }
返回的分词结果将包含:lorem123、+、ipsum、-、dolar(如果启用了lowercase过滤器,字母会转为小写)。
替代方案:字符映射法
你也可以通过字符过滤器先给分隔符前后添加空格,再用标准分词器拆分:
PUT /symbol_aware_index_alt { "settings": { "analysis": { "char_filter": { "symbol_space_mapper": { "type": "mapping", "mappings": [ "+ => \\ +", "- => \\ -" ] } }, "analyzer": { "symbol_preserving_analyzer": { "type": "custom", "char_filter": ["symbol_space_mapper"], "tokenizer": "standard", "filter": ["lowercase"] } } } } }
这种方法通过给+和-前后添加空格,让标准分词器将其识别为独立token,效果与第一种方法一致。
内容的提问来源于stack exchange,提问作者stan
相关产品推荐
相关产品推荐

