真实对比有无html_strip char_filter时HTML文本的分词结果差异,并用tokenizer参数拒绝数组的真实报错,证明三种组件在Analyzer链路里结构性不同的角色。
代码POST /_analyze {"tokenizer": "standard", "text": "<p>Hello <b>World</b></p>"} POST /_analyze {"char_filter": ["html_strip"], "tokenizer": "standard", "text": "<p>Hello <b>World</b></p>"} POST /_analyze {"tokenizer": ["standard", "whitespace"], "text": "hello world"} # 能传两个tokenizer吗
不加char_filter直接分词: → ['p', 'Hello', 'b', 'World', 'b', 'p'] ← 真实把标签名p和b当成了独立单词 加了html_strip char_filter: → ['Hello', 'World'] ← 真实干净了,标签全部被在分词前清除
这组对比真实说明了char_filter必须在分词之前工作的原因:标准分词器真实只会按字符类型(字母、数字、标点)切词,它完全不认识"这是个HTML标签"这种结构化概念,<p>里的尖括号被当成分隔符丢掉之后,剩下的字母p真实会被当成一个合法的独立单词保留下来,直接污染了分词结果。html_strip这个char_filter真实必须抢在分词之前,在原始字符串这个层面就把整个标签结构识别出来并连标签名一起清除,等轮到tokenizer介入的时候,它看到的已经真实是干净的纯文本。
POST /_analyze {"tokenizer": ["standard", "whitespace"], ...}
→ 400 x_content_parse_exception:
"tokenizer doesn't support values of type: START_ARRAY"每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
_analyze API 与 html_strip char_filter