ElasticSearch match全文检索

说明

match 可以像百度搜索那样,实现全文查询。
先对查询字符串进行分词,然后在指定字段中匹配这些分词(默认是 或 逻辑)

字段类型

适用于 text 类型,不区分大小写

比如:搜索 mysql java,可以将带有 mysql、java 字样的都查询出来

注意:如果查询数字类型,是精确匹配

用法

最简形式

GET /my_index/_search
{
  "query": {
    "match": {
      "content": "快速的狐狸"  // 字段名: 查询字符串
    }
  }
}

解释:

  • Elasticsearch 会先用 content 字段的分词器(如 ik)将 快速的狐狸 拆分为 ["快速", "的", "狐狸"]

  • 文档只要包含任意一个分词(快速/的/狐狸)就会被匹配,得分按相关性排序。

指定匹配逻辑(operator)

通过 operator 参数控制分词的匹配逻辑:

  • OR(默认):匹配任意分词即可
  • AND:必须匹配所有分词
GET /my_index/_search
{
  "query": {
    "match": {
      "content": {
        "query": "快速的狐狸",
        "operator": "AND"  // 必须同时包含“快速”+“的”+“狐狸”
      }
    }
  }
}

例子

GET /toutiao_v1/_search
{
    "query":{
        "match":{
            "title":"mysql java"
        }
    }
}

可以将带有 mysql、java字样的都查询出来

查询结果:

{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 4,
            "relation": "eq"
        },
        "max_score": 1.0498221,
        "hits": [
            {
                "_index": "toutiao",
                "_type": "_doc",
                "_id": "I0DMmnsBX6WTxsmdbeUg",
                "_score": 1.0498221,
                "_source": {
                    "title": "JAVA mysql技巧大全",
                    "content": "JAVA是使用最广泛的开发语言,mysql使用最多的数据库",
                    "weight": 7
                }
            },
            {
                "_index": "toutiao",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.60996956,
                "_source": {
                    "title": "mysql从入门到放弃2.0",
                    "content": "mysql技术内幕",
                    "weight": 9
                }
            },
            {
                "_index": "toutiao",
                "_type": "_doc",
                "_id": "JkDMmnsBX6WTxsmdiuVE",
                "_score": 0.44839138,
                "_source": {
                    "title": "JAVA技巧",
                    "content": "JAVA高级技巧",
                    "weight": 5
                }
            },
            {
                "_index": "toutiao",
                "_type": "_doc",
                "_id": "pGcmlnsBRQ4q0pqf1bII",
                "_score": 0.33390847,
                "_source": {
                    "title": "JAVA从入门到放弃",
                    "content": "JAVA高手的技巧,java基础、高级",
                    "weight": 10
                }
            }
        ]
    }
}

说明:

  • _score:查询内容,与字段内容的匹配分数
  • "title":"mysql java":将查询条件 mysql、java 分成2个词,进行匹配
  • 根据分数从高到底排序

不支持中文

这里为了演示,把 技入 当成一个词,但 ES 会查询出所有包含 技、入 的标题,ES 不会把 技入 当成一个词。详见 elasticsearch ik分词器介绍

GET /toutiao_v1/_search
{
    "query":{
        "match":{
            "title":"技入"
        }
    }
}

会查询出所有包含 技、入 的标题

参数解释

match 查询支持丰富的参数来定制匹配行为:

参数 作用
query 要检索的字符串(必填)
operator 分词匹配逻辑:OR/AND
minimum_should_match 最小匹配分词数(优先级高于 operator),支持数字(如 2)或百分比(如 75%)
fuzziness 开启模糊匹配,容错输入错误(如 AUTO/0/1/2)
prefix_length 模糊匹配时,指定词项前缀不参与模糊(如 prefix_length: 2)
max_expansions 模糊匹配时,控制扩展的词项数量(避免性能问题)
boost 提升查询权重(如 boost: 2,得分×2)
lenient 忽略类型转换错误(如 lenient: true,字符串查询数字字段不会报错)

minimum_should_match(最小匹配数)

比 operator 更灵活的匹配控制:

GET /my_index/_search
{
  "query": {
    "match": {
      "content": {
        "query": "快速的狐狸跑过",
        "minimum_should_match": "3"  // 至少匹配3个分词
      }
    }
  }
}

解释: 分词结果是 ["快速", "的", "狐狸", "跑过"],文档需至少包含其中 3个分词 才会被匹配。

模糊匹配(fuzziness)

容错输入错误(如拼写错误):

GET /my_index/_search
{
  "query": {
    "match": {
      "content": {
        "query": "快速的狐理",  // “狸”写成“理”
        "fuzziness": "AUTO",    // 自动适配模糊度(根据词长)
        "prefix_length": 2      // 前2个字符(“快速”)精准匹配
      }
    }
  }
}

解释:

  • AUTO 规则:词长 ≤2,不允许模糊;3-5,允许1个编辑距离;>5,允许2个编辑距离。

  • 编辑距离:指将一个词改为另一个词所需的最少操作(增/删/改字符)。

match 和 term 区别

match 和 term 是最易混淆的两个查询,关键区别如下:

特性 match term
分词处理 对查询字符串分词(适合 text 字段) 不分词(适合 keyword/数字/日期字段)
适用字段类型 text(全文检索) keyword/integer/date(精确值匹配)
示例 match: {content: "快速的狐狸"} term: {status: "published"}

例子

博客文章搜索(基础全文检索)

GET /blogs/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Elasticsearch 实战",
        "operator": "AND",
        "boost": 3  // 标题权重×3
      }
    }
  }
}

电商商品搜索(带模糊容错)

GET /products/_search
{
  "query": {
    "match": {
      "name": {
        "query": "iPone 15",  // “Phone”写成“Pone”
        "fuzziness": 1,
        "prefix_length": 1,
        "minimum_should_match": "2"
      }
    }
  }
}

总结

  1. match 是全文检索的核心:会对查询字符串分词,适合 text 字段的模糊匹配。
  2. 关键参数:operator/minimum_should_match 控制匹配严格度,fuzziness 处理拼写错误。
  3. 与 term 区分:match 分词(text字段),term 不分词(keyword/精确值字段)。
  4. 扩展类型:match_phrase(短语匹配)、match_bool_prefix(前缀联想)满足不同场景需求。

原文出处:/show_1IX1mCgZJ1kb.html