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