You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Elasticsearch中结合html_strip与英文分析器时如何正确分词?

解决Elasticsearch英文分析器与HTML标签过滤的兼容问题

我懂你现在的困扰——用english分析器处理带HTML标签的英文文本时,明明加了html_strip字符过滤器,结果还是把<html>标签里的"html"当成词元重复识别,导致分词结果多了不该有的内容,没能得到预期的3个词元。

问题出在你调用_analyze的方式上:当你同时指定analyzerchar_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": "&lt;html&gt;It will be raining in yosemite this weekend&lt;/html&gt;"
}

这样就能先彻底移除所有HTML标签,再按英文分析规则处理文本,最终得到rainyosemiteweekend这3个符合预期的词元。

方法2:在请求中明确指定完整分析流程

如果你不想提前创建自定义分析器,也可以直接在_analyze请求里复刻english分析器的逻辑,同时加上html_strip

POST _analyze
{
  "char_filter": ["html_strip"],
  "tokenizer": "standard",
  "filter": ["lowercase", "english_stop", "english_stemmer"],
  "text": "&lt;html&gt;It will be raining in yosemite this weekend&lt;/html&gt;"
}

这个请求会严格按照「HTML标签过滤 → 标准分词 → 转小写 → 过滤英文停用词 → 词干提取」的顺序处理,同样能得到你想要的3个词元。

内容的提问来源于stack exchange,提问作者John

火山引擎 最新活动