🌺The Begin🌺点点关注,收藏不迷路🌺

一、前言

在 Elasticsearch 查询开发中,精准匹配全文检索匹配是最常用、最容易混淆的两种查询方式。

90%的新手踩坑都是因为:搞不清两者区别、用错查询方式、字段类型不匹配,导致查不到数据、查询不准确、性能极慢等问题。

本文从定义、原理、流程图、字段依赖、核心区别、使用场景、实战示例全方位讲解,让你彻底掌握两种查询,写出最优ES查询语句。


二、Elasticsearch 精准匹配与全文检索匹配:基础定义

2.1 精准匹配(Exact Matching)

精准匹配:查询词不分词、不分析,与文档字段原值完全一致时才命中,追求完全相等

核心API:termtermsmatch_phrase(严格短语)

2.2 全文检索匹配(Full-text Matching)

全文检索匹配:查询词先分词,再与文档分词后的词语任意匹配,追求相关度,返回相关性最高的结果。

核心API:matchmulti_matchquery_string


三、核心工作原理流程图(直观理解区别)

3.1 精准匹配 工作流程图(term查询)

输入查询词:北京

精准匹配:不分词、不分析

去索引中查找:完全等于“北京”的文档

只有完全一致才返回

结果:精确、无歧义

3.2 全文检索匹配 工作流程图(match查询)

输入查询词:北京天气

全文检索:分词器拆分

拆分结果:北京 / 天气

去索引中匹配任意词语

包含任意词即可命中,按相关性排序

结果:模糊、智能、相关度排序

3.3 一句话原理区别

精准匹配 = 整体匹配,完全相等
全文检索 = 分词匹配,包含即可


四、精准匹配 vs 全文检索匹配:8大核心区别(必背)

4.1 是否分词(最本质区别)

  1. 精准匹配不分词,查询串作为整体匹配
  2. 全文检索必须分词,先拆分再查询

4.2 依赖字段类型

  1. 精准匹配:依赖 keyword 字段
  2. 全文检索:依赖 text 字段

4.3 查询结果特点

  1. 精准匹配完全一致才返回,无相关性评分
  2. 全文检索包含任意词就返回,按相关性评分排序

4.4 性能

  1. 精准匹配极快,底层倒排索引直接定位
  2. 全文检索:较慢,需要分词、匹配、打分、排序

4.5 适用场景

  1. 精准匹配:状态、ID、枚举、手机号、姓名、城市等值
  2. 全文检索:文章、标题、描述、评论、内容搜索

4.6 大小写敏感

  1. 精准匹配大小写敏感Aa
  2. 全文检索:大小写不敏感(会统一转为小写)

4.7 核心API

  1. 精准匹配termterms
  2. 全文检索matchmulti_match

4.8 结果排序

  1. 精准匹配:不计算得分,默认按文档ID排序
  2. 全文检索:计算得分,按相关性排序

五、直观对比示例(一看就懂)

5.1 测试数据

文档字段:
city: keyword(北京、上海市、广州市)
title: text(北京天气、上海疫情、北京旅游)

5.2 精准匹配查询(term)

GET /index/_search
{
  "query": {
    "term": {
      "city": "北京"  // 完全一致才命中
    }
  }
}

✅ 命中:city=北京
❌ 不命中:city=北京市、city=北京区

5.3 全文检索查询(match)

GET /index/_search
{
  "query": {
    "match": {
      "title": "北京天气"  // 分词为北京、天气
    }
  }
}

✅ 命中:包含北京天气的所有文档


六、实战语法大全

6.1 精准匹配语法(term/terms)

1. 单值精准匹配
GET /user/_search
{
  "query": {
    "term": {
      "phone": "13800138000"
    }
  }
}
2. 多值精准匹配(IN查询)
GET /user/_search
{
  "query": {
    "terms": {
      "city": ["北京", "上海", "广州"]
    }
  }
}

6.2 全文检索语法(match)

1. 单字段全文检索
GET /article/_search
{
  "query": {
    "match": {
      "content": "Elasticsearch 教程"
    }
  }
}
2. 多字段全文检索
GET /product/_search
{
  "query": {
    "multi_match": {
      "query": "手机",
      "fields": ["name", "desc"]
    }
  }
}

七、字段类型与查询匹配规则(避坑核心)

查询方式支持字段类型不支持字段类型后果
精准匹配 termkeywordtext查不到数据
全文检索 matchtextkeyword无效,相当于精准匹配

7.1 经典踩坑

  1. 用 term 查询 text 字段 → 查不到数据
  2. 用 match 查询 keyword 字段 → 变成精准匹配
  3. 查询词大小写错误 → term 查询无结果

八、使用场景选型指南

8.1 必须使用精准匹配(term)的场景

  1. 用户ID、订单ID、手机号精确查询
  2. 状态值过滤:status=1is_delete=0
  3. 枚举值过滤:性别、城市、类型
  4. 不需要分词、必须完全相等的场景
  5. 聚合、排序、统计场景

8.2 必须使用全文检索(match)的场景

  1. 文章内容搜索、标题搜索
  2. 商品名称模糊搜索
  3. 评论、描述、日志检索
  4. 需要智能匹配、相关度排序的场景

九、总结:核心区别口诀

  1. 精准匹配:不分词、整体相等、查keyword、速度极快、精确
  2. 全文检索:分词、包含即可、查text、速度稍慢、智能相关
  3. text 字段用 match
  4. keyword 字段用 term
  5. 精准查状态ID,全文搜内容描述

文末总结

精准匹配和全文检索是 Elasticsearch 的两大核心查询体系

  • 精准匹配(term) = 精确、快速、不分词、查keyword
  • 全文检索(match) = 模糊、智能、分词、查text

只要记住字段类型+查询方式对应规则,就能彻底避免查询错误,写出高性能ES语句。


总结

  1. 本质区别:精准匹配不分词,全文检索分词
  2. 字段区别:精准匹配用keyword,全文检索用text
  3. API区别:精准匹配term,全文检索match
  4. 性能区别:精准匹配极快,全文检索较慢
  5. 场景区别:精准查ID/状态,全文搜内容/标题

在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐