文章二十: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"    // 按文本在文档里**出现的先后顺序**排序
相关推荐
2601_956139422 小时前
集团品牌全案公司哪家专业
大数据·人工智能·python
yyuuuzz2 小时前
国际云服务器的技术特性与使用场景
运维·服务器
代码中介商2 小时前
Linux多线程编程进阶:fork与锁的交互及网络编程入门
linux·运维·服务器
Lyyaoo.2 小时前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
我不是立达刘宁宇2 小时前
权限提升-前置基础-linux
linux·运维·服务器
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月3日
大数据·人工智能·python·信息可视化·自然语言处理
salipopl2 小时前
Spring Boot 整合 Druid 并开启监控
java·spring boot·后端
灵机一物2 小时前
灵机一物AI原生电商小程序、PC端(已上线)-AI产业深度解析:Token供需失衡下的算力战争与产业变革
大数据·人工智能·深度学习
dovens2 小时前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql