首页/数据/NoSQL 速查/highlight 关键词高亮
Elasticsearch89 条

highlight 关键词高亮

highlight 让匹配片段在结果中带标记返回:fields 指定要高亮的字段,pre_tags/post_tags 自定义包裹标签,number_of_fragments 控制片段数量。

NoSQL 速查数据更新于 2026-10-13

highlight 是什么

highlight 让命中的关键词在返回结果里被标签包裹,前端可以直接渲染成加粗或高亮效果。fields 指定要高亮的字段,pre_tags 与 post_tags 自定义包裹标签,fragment_size 控制每段字符数,number_of_fragments 控制返回几段(设为 0 表示返回整段字段值)。默认高亮器是 unified,另有 plain 与 fvh(需要 mapping 里开启 term_vector)。require_field_match 默认为 true,只有查询命中的字段才会被高亮。

基本信息

常用参数fields、pre_tags/post_tags、fragment_size、number_of_fragments
高亮器unified(默认)、plain、fvh(需 term_vector)
字段匹配require_field_match 默认 true
内容来源_source 或词向量(term_vector)
关闭片段number_of_fragments 为 0 时返回整段字段值
所属系统Elasticsearch 全版本,通过 _search 请求体的 highlight 段使用

典型使用场景

  • 搜索结果展示:列表页把关键词加粗,用户一眼看到匹配位置
  • 摘要片段:长正文只返回命中附近的一小段,显著减小响应体积
  • 多字段高亮:标题与正文分别高亮,展示层级更清晰
  • 自定义标签:把 <em> 换成前端组件需要的标签或带样式的元素
  • 核对分词效果:通过高亮片段确认命中词是否被切分成了预期形态

请求写法

请求写法
GET /my-index/_search
{
  "query": { "match": { "content": "elasticsearch tutorial" } },
  "highlight": {
    "pre_tags": ["<em>"],
    "post_tags": ["</em>"],
    "fields": {
      "content": { "fragment_size": 120, "number_of_fragments": 2 },
      "title":   { "number_of_fragments": 0 }   # 标题整段高亮
    }
  }
}

参数读法

参数作用注意
fields要高亮的字段字段需参与查询或被允许高亮
fragment_size片段字符数太小会把句子切断,太大响应变大
number_of_fragments片段数量0 表示整段字段值
pre/post_tags包裹标签前端渲染前必须转义
require_field_match只高亮命中字段设为 false 可跨字段高亮
高亮词来自 _source 或词向量:字段既关闭 _source 又没开 term_vector 时无法高亮,接口不会报错,只是结果里没有 highlight 段落,排查时要先确认字段的存储设置。
高亮片段里是原始文本,直接拼进 HTML 会带来注入风险;渲染前必须转义,或让服务端只输出安全标签。
unified 高亮器对多语言与复杂查询的兼容性最好;fvh 需要字段在 mapping 里开启 term_vector 且只支持部分查询类型,更换高亮器前先对照官方说明确认字段能满足前提。

易错点

  • 对 keyword 字段高亮会显示整串而非片段,长文本要另外配 text 字段
  • number_of_fragments 设为 0 表示返回整段内容,大文档下响应会明显变大
  • 关闭 _source 又没开 term_vector 的字段高亮静默失效,容易误判为查询没命中
  • 把高亮片段当成命中解释:前缀、通配符等查询的高亮范围与匹配逻辑不完全一致

数据来源与参考

  • Elasticsearch Guide: Highlighting
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌