文章二十:Elasticsearch高亮搜索完全指南

hightlinging简单用法:

  • 本文中展示的简单用法足够支持大多数业务

  • pre_tags 高亮词语的前置标签

  • post_tags 高亮词语的后置标签

  • highlight_query 指明了在查询词语中,哪些词语需要高亮处理

    GET kibana_sample_data_logs/_search
    {
    "track_total_hits": true,
    "query": {
    "bool": {
    "must": [
    {
    "match": {
    "message": {
    "query": "type:astronauts elasticsearch Mozilla",
    "analyzer": "standard"
    }
    }
    }
    ]
    }
    },
    "highlight": {
    "highlight_query": {
    "bool": {
    "must": [
    {
    "match": {
    "message": "Mozilla"
    }
    }
    ]
    }
    },
    "fields": {
    "message":{
    "pre_tags": ["

    "],
    "post_tags": ["

    "]
    }
    }
    }
    }

属性名 作用 你的例子写法 通俗解释
highlight 开启搜索结果高亮,是顶级节点 "highlight": {} 告诉 ES:我要对结果做关键词高亮
highlight_query 指定单独的高亮查询 "bool": { "must": [ { "match": { "message": "Mozilla" } } ] } 只高亮 Mozilla,不高亮其他搜索词
fields 指定对哪个字段高亮 "message": {} 只对 message 字段做高亮
pre_tags 高亮内容前缀标签 ["<h1>"] 匹配词前面加 <h1>
post_tags 高亮内容后缀标签 ["</h1>"] 匹配词后面加 </h1>

hightlinging高级使用:

属性名 作用 示例写法 通俗解释
type 指定高亮器类型(高级核心) "type":"fvh" 切换 unified / plain / fvh 三种高亮模式
fragment_size 控制单条高亮片段字数 "fragment_size":200 截取关键词前后指定长度的文本片段
number_of_fragments 控制返回高亮片段数量 "number_of_fragments":2 一篇文档最多返回几条高亮片段
no_match_size 无关键词匹配时兜底文本长度 "no_match_size":100 没有命中高亮词,默认返回正文前N字摘要
matched_fields FVH 专属多字段合并高亮 "content","content.ik" 多个字段的匹配结果,合并在一个字段高亮展示

三种高亮器(type)完整高级特性

ES 高亮核心高级能力就是切换 type 高亮器,三种类型覆盖所有生产场景。

1、unified(默认高亮器)

ES7+ 系统默认,自适应高亮器,无需任何 mapping 配置,兼顾性能与准确度,通用场景首选。

特点:自动适配普通文本/词向量文本,支持所有查询类型,稳定性最高。

2、plain(基础高亮器)

老旧高亮器,查询时实时分词计算,无需索引配置。

特点 :小文本可用,大文本极卡 CPU,不支持多字段合并高亮,生产不推荐用于正文。

3、fvh(高性能向量高亮器·生产核心)

大文本、正文、文档搜索专用高亮器,性能最强,唯一支持多字段合并高亮。

强制 Mapping 依赖:字段必须配置词向量+独立存储

"content": { "type": "text", "term_vector": "with_positions_offsets", "store": true }

作用解释

  • term_vector:索引时预存分词位置、偏移量,高亮无需实时计算

  • store:独立存储字段内容,不解析大体积 _source,性能翻倍

2.3 高级 Demo1:FVH 高性能高亮(大文本生产标配)

适用于文章、知识库、日志正文等大文本场景

GET /my_fvh_demo/_search { "query": { "match": { "content": "ES 高亮 FVH 性能优化" } }, "highlight": { "type": "fvh", "pre_tags": ["<mark>"], "post_tags": ["</mark>"], "fragment_size": 200, "number_of_fragments": 2, "no_match_size": 100, "fields": { "content": {} } } }

2.4 高级 Demo2:FVH 独有能力------多字段合并高亮

场景:主字段+分词子字段同时搜索,所有匹配词统一在主字段高亮展示,仅 FVH 支持

GET /my_fvh_demo/_search { "query": { "multi_match": { "query": "Fast Vector 高亮器", "fields": ["content","content.english"] } }, "highlight": { "type": "fvh", "pre_tags": ["<b style='color:red'>"], "post_tags": ["</b>"], "fields": { "content": { "matched_fields": ["content","content.english"] } } } }

2.5 高级 Demo3:unified 默认高亮完整配置(通用业务标配)

GET kibana_sample_data_logs/_search { "track_total_hits": true, "query": { "match": { "message": "elasticsearch Mozilla" } }, "highlight": { "type": "unified", "fragment_size": 150, "number_of_fragments": 1, "no_match_size": 50, "pre_tags": ["<span style='color:red'>"], "post_tags": ["</span>"], "fields": { "message": {} } } }

全部字段高亮展示:

基于一个查询关键词查询出来的所有包含关键字的部分都会高亮展示

require_field_match = 是否要求 "查询字段" 和 "高亮字段" 必须是同一个?

  • true(默认):必须同一个字段才能高亮→ 查 message → 只高亮 message
  • false不用同一个字段→ 查 message → message、url、xxx 全都能高亮

案例展示:查询message的关键字,如果在url中存在,也会高亮

复制代码
GET kibana_sample_data_logs/_search
{
  "track_total_hits": true,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "Mozilla Firefox elastic"
          }
        }
      ]
    }
  },
  "highlight": {
    "require_field_match": "false", 
    "fields": {
      "message":{},
      "url":{}
    }
  } 
}

number_of_fragments

控制返会高亮字段的数量:

案例中展示的是:

在设置最大数量是1之后,返回的截图和未设置返会截图的对比,由此可见配置生效

复制代码
GET kibana_sample_data_logs/_search
{
  "track_total_hits": true,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "Mozilla Firefox elastic"
          }
        }
      ]
    }
  },
  "highlight": {
    "number_of_fragments": 1, 
    "require_field_match": "false", 
    "fields": {
      "message":{},
      "url":{},
      "request":{}
    }
  } 
}

这个参数可以在顶级配置中使用,也可以在当前字段的配置中使用,大家按需使用就好了。下面展示了一下使用的不同方式:

复制代码
GET kibana_sample_data_logs/_search
{
  "track_total_hits": true,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "Mozilla Firefox elastic"
          }
        }
      ]
    }
  },
  "highlight": {
    "number_of_fragments": 1, 
    "require_field_match": "false", 
    "fields": {
      "message":{
        "number_of_fragments": 2
      },
      "url":{},
      "request":{}
    }
  } 
}

fragment_size

控制单条高亮片段字数,使用方式通number_of_fragments相同。

order

order 是用来控制:当一个字段里有多个高亮片段时,按什么顺序返回给你。

它只有 2 个可选值

复制代码
"order": "score"   // 默认:按匹配分数排序(最相关的排前面)
"order": "none"    // 按文本在文档里**出现的先后顺序**排序
相关推荐
123_不打狼21 分钟前
AI Agent可观测性:破解多步推理黑盒的技术实践
大数据·人工智能
草莓熊Lotso23 分钟前
【Linux网络】从0手写Reactor反应堆(二):完善核心细节——ET非阻塞读写、分层架构与回调机制
linux·运维·服务器·网络·c++·tcp/ip·架构
未秃头的程序猿26 分钟前
凌晨3点被叫醒:线上OOM,我用这套流程40分钟定位根因
java·jvm·后端
LaughingZhu32 分钟前
Product Hunt 每日热榜 | 2026-08-09
人工智能·深度学习·神经网络·搜索引擎·百度
letisgo544 分钟前
JDK21 + Spring AI 2.0 入场指南:2026 年 Java 开发者 AI 架构全景图
java·ai·idea·jdk21
白仑色1 小时前
Spring Boot 从切面统一控制事务
java·spring boot·aop·spring事务
Flynt1 小时前
Java并行流,让我debug了一整天
java
xlq223221 小时前
高并发服务器day21
运维·服务器
用户3610588626121 小时前
Spark 核心之二次排序、分组取 TopN 优化分析
大数据·spark
DFT计算杂谈1 小时前
FeSe超薄膜在CaF2衬底上的电子结构DFT研究
java·服务器·前端