2019 年使用 Elasticsearch 7.x 时,我看到的高亮类似:

{
  "highlight": {
    "title": ["<em>专</em><em>题</em>1"]
  }
}

期待的却是把“专题”作为一个整体高亮。这个现象值得检查分析器,但标签的切分本身不是分析结果的完整证据。

定义分析器,不等于字段使用它

当时在 settings 中定义了分析器,却没有把预期的分析方式明确绑定到相关字段。具备匹配版本的 IK 插件时,字段映射可能包含:

{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_max_word"
    },
    "content": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_max_word"
    }
  }
}

这只是字段定义片段,不是完整建索引请求或插件安装教程。自定义分析器的名称、tokenizer 名称和字段引用还要一致,且插件必须真实存在。

用字段分析请求看 token

先读取目标索引的 mapping,再使用该字段分析同一段文本:

GET /example_articles/_mapping
POST /example_articles/_analyze
{
  "field": "title",
  "text": "专题1"
}

观察 token、位置和偏移,再与实际查询使用的分析方式对照。ES 7.3 Analyze API

需要分清三个事实:配置中存在分析器、字段映射引用它、索引里的这批文档确实用它建立过词项。改变索引期分析配置通常涉及新索引和重建,不能认为保存配置会重新分析所有旧文档。

高亮还取决于查询

同时保存完整 DSL、highlighter 类型和原始返回。查询字段、显式 analyzer、短语或模糊条件,都可能改变匹配与高亮范围。

因此,这次经历能够说明字段绑定值得检查,但不能推广成“逐字高亮一定是 IK 没生效”。若问题是命中但完全没有高亮,可结合高亮为空的排查记录比较请求;两者不应预设为同一根因。