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 且只支持部分查询类型,更换高亮器前先对照官方说明确认字段能满足前提。