Elasticsearch自定义分析器无匹配时如何输出默认token?
解决Elasticsearch自定义分析器无输出时返回默认token的问题
要实现无匹配同义词时自动返回typeA的需求,你需要在自定义分析器中添加一个Painless脚本过滤器,用来在所有前置过滤器处理完成后,检查token流是否为空,为空则插入默认token。
修改后的完整配置
{ "settings": { "analysis": { "filter": { "EngStopWordsRemover": { "type": "stop", "stopwords": "_english_" }, "EngStemmer": { "type": "stemmer", "language": "english" }, "SpaceTokenRemover": { "type": "pattern_replace", "pattern": "\\s+", "replacement": "" }, "CustomTranslator": { "type": "synonym", "synonyms": [ "volunt,voluntari,chip,regist => typeA", "program,event,particip,partak,regist => typeB", "contribut,donat,donor,give,provid,sponsor,fund,raise,money,support => typeC", "enlist,associat,enrol,join,member,membership,regist => typeD" ] }, "DefaultTypeAFallback": { "type": "script", "script": { "source": """ if (token_stream.length == 0) { token_stream.add(new Token("typeA", 0, 5)); } """ } } }, "analyzer": { "MyCustomTypeAnalyzer": { "filter": [ "EngStopWordsRemover", "lowercase", "EngStemmer", "CustomTranslator", "SpaceTokenRemover", "unique", "DefaultTypeAFallback" ], "tokenizer": "standard" } } } } }
关键配置说明
- 脚本过滤器
DefaultTypeAFallback:- 使用Painless脚本直接操作token流,在所有前置过滤器处理完毕后执行
- 逻辑简单直接:判断
token_stream的长度,若为0则添加typeAtoken(Token构造函数的偏移参数仅用于标记位置,不影响查询匹配逻辑)
- 过滤器顺序:将脚本过滤器放在最后,确保前面的停用词移除、词干提取、同义词转换等处理完成后,再检查是否需要添加默认token
测试验证
- 输入
"I would like to spend some time teaching kids":经过所有前置过滤器处理后token流为空,脚本过滤器会自动添加typeA - 输入
"I would like to join a teaching activity":前置过滤器会生成typeD,脚本过滤器检测到token流非空,不会执行添加操作
内容的提问来源于stack exchange,提问作者Sumanth Sharma
相关产品推荐
相关产品推荐

