Elasticsearch中结合html_strip与英文分析器时如何正确分词?
解决Elasticsearch英文分析器与HTML标签过滤的兼容问题
我懂你现在的困扰——用english分析器处理带HTML标签的英文文本时,明明加了html_strip字符过滤器,结果还是把<html>标签里的"html"当成词元重复识别,导致分词结果多了不该有的内容,没能得到预期的3个词元。
问题出在你调用_analyze的方式上:当你同时指定analyzer和char_filter参数时,Elasticsearch并不会把html_strip整合进english分析器的完整流程里,这种混用方式会导致标签过滤不彻底,最终让标签里的"html"被当成普通文本参与分词。
这里有两种靠谱的解决办法:
方法1:自定义整合html_strip的英文分析器
最稳妥的方式是创建一个自定义分析器,把html_strip作为前置字符过滤器,同时保留english分析器的核心功能(停用词过滤、词干提取):
PUT /your_target_index { "settings": { "analysis": { "analyzer": { "english_with_html_strip": { "char_filter": ["html_strip"], "tokenizer": "standard", "filter": ["lowercase", "english_stop", "english_stemmer"] } }, "filter": { "english_stop": { "type": "stop", "stopwords": "_english_" }, "english_stemmer": { "type": "stemmer", "language": "english" } } } } }
创建好索引后,用这个自定义分析器测试:
POST your_target_index/_analyze { "analyzer": "english_with_html_strip", "text": "<html>It will be raining in yosemite this weekend</html>" }
这样就能先彻底移除所有HTML标签,再按英文分析规则处理文本,最终得到rain、yosemite、weekend这3个符合预期的词元。
方法2:在请求中明确指定完整分析流程
如果你不想提前创建自定义分析器,也可以直接在_analyze请求里复刻english分析器的逻辑,同时加上html_strip:
POST _analyze { "char_filter": ["html_strip"], "tokenizer": "standard", "filter": ["lowercase", "english_stop", "english_stemmer"], "text": "<html>It will be raining in yosemite this weekend</html>" }
这个请求会严格按照「HTML标签过滤 → 标准分词 → 转小写 → 过滤英文停用词 → 词干提取」的顺序处理,同样能得到你想要的3个词元。
内容的提问来源于stack exchange,提问作者John




