Elasticsearch自定义Analyzer配置后,搜索表情或happy无匹配原因咨询
问题原因分析
1. 核心问题:字段未关联自定义分析器
你仅在索引的settings中定义了my_custom_analyzer,但未给content字段配置映射以指定使用该分析器。Elasticsearch对未手动指定映射的字符串字段,默认会使用standard标准分析器,完全不会触发你定义的表情替换、自定义分词和停用词过滤逻辑。
也就是说,写入文档时,content字段里的:)和:(根本没有被转换成_happy_和_sad_,自然无法通过搜索happy或:)匹配到目标文档。
2. 分词器正则的潜在问题(次要)
你定义的punctuation分词器使用正则[ .,!?]作为分隔符,该正则会匹配单个空格、点、逗号、感叹号、问号来切分文本。原文本中feeling :)以空格分隔,:)会被单独切分为一个token,但因为没有关联自定义分析器,这个token不会被字符过滤器替换成_happy_。不过这不是当前搜索不到的主要原因。
验证与修复示例
修复字段映射(必须步骤)
创建索引时需要同时定义字段映射,指定content字段使用自定义分析器:
PUT /my-index-000003 { "settings": { "analysis": { "analyzer": { "my_custom_analyzer": { "char_filter": [ "emoticons" ], "tokenizer": "punctuation", "filter": [ "lowercase", "english_stop" ] } }, "tokenizer": { "punctuation": { "type": "pattern", "pattern": "[ .,!?]" } }, "char_filter": { "emoticons": { "type": "mapping", "mappings": [ ":) => _happy_", ":( => _sad_" ] } }, "filter": { "english_stop": { "type": "stop", "stopwords": "_english_" } } } }, "mappings": { "properties": { "content": { "type": "text", "analyzer": "my_custom_analyzer" // 指定使用自定义分析器 } } } }
验证分析器效果
可以用_analyze接口测试自定义分析器的处理结果:
POST /my-index-000003/_analyze { "analyzer": "my_custom_analyzer", "text": "I'm feeling :) today, but the weather is quite gloomy :(" }
返回的token会包含_happy_和_sad_,此时再写入文档并搜索happy或:)(需确保搜索时使用相同分析器),就能匹配到目标文档。
内容的提问来源于stack exchange,提问作者Mert Öztürk
相关产品推荐
相关产品推荐

