match查询:
| 参数 | 含义 | 取值说明 | 默认值 | 备注 |
|---|---|---|---|---|
| query | 查询关键词 | 要搜索的文本内容 | 必填 | 你要检索的字符串 |
| analyzer | 分词器 | 指定对查询词分词的分析器 | 字段映射的分词器 | 如:ik_max_word/standard |
| minimum_should_match | 最小匹配词数 | 分词后最少匹配几个词才算命中 | 1 | 支持数值 / 百分比,如 2、75% |
| operator | 多词匹配逻辑 | 分词后词之间的关系 | or |
or:满足任意;and:必须全部 |
| boost | 权重加权 | 对查询分数进行加权 | 1.0 | 数值越大权重越高 |
| fuzziness | 模糊匹配 | 允许编辑距离(容错)这个是针对于一个单词来讲的 | 0 不开启 |
AUTO、1、2 |
| prefix_length | 模糊匹配前缀长度 | 模糊匹配时前 N 个字符不允许错 | 0 | 配合 fuzziness 使用 |
| max_expansions | 模糊最大扩展词数 | 模糊查询最大扩展数量 | 50 | 控制性能与结果集 |
| fuzzy_transpositions | 模糊换位容错 | 允许相邻字符互换(ab→ba) | true | 提升拼写容错 |
| lenient | 容错模式 | 忽略类型转换错误 | false | 如字符串查数字字段不报错 |
| zero_terms_query | 空词查询策略 | 分词后无词时的处理 | none |
none不匹配 / all匹配全部 |
| auto_generate_synonyms_phrase_query | 自动生成同义词短语查询 | 是否对同义词生成短语查询 | true | 同义词相关优化 |
match_bool_prefix:
match_bool_prefix 是 ES 7.0+ 提供的语法糖 ,用来快速实现「前面的词精确匹配、最后一个词前缀匹配 」的布尔组合,省去你手动写 bool+term+prefix 的麻烦。
| 参数 | 含义 | 默认值 | 说明 |
|---|---|---|---|
query |
搜索文本(必填) | - | 会被分词器拆分 |
analyzer |
分词器 | 字段默认分词器 | 控制如何拆词 |
operator |
逻辑关系:or/and |
or |
and= 所有词都要有;or= 有一个就行 |
minimum_should_match |
最少匹配词数 | 1 | 百分比 / 数字,如 2、75% |
max_expansions |
前缀最多扩展词数 | 50 | 控制性能,防止前缀爆炸 |
使用案例
GET index_test/_search
{
"query": {
"match_bool_prefix": {
"Dest": {
"query": "Sydney Kingsford S",
"analyzer": "standard",
"operator": "or",
"minimum_should_match": 2,
"max_expansions": 50
}
}
}
}
match_phrase:
专门用来查连续、有序的文本
| 参数 | 含义 | 默认值 | 说明 |
|---|---|---|---|
| query | 查询短语(必填) | - | 要搜索的完整短语 |
| slop | 短语间隔容忍度 | 0 | 词之间允许跨越多少位置;0=必须严格连续 |
| analyzer | 分词器 | 字段映射分词器 | 对查询文本使用的分词器 |
| boost | 权重加权 | 1.0 | 提高 / 降低该查询的分数 |
| zero_terms_query | 空词处理 | none | 分词后无词时是否返回全部(可以填写的模式是none/all(如果查询为空的时候直接返回全部数据)) |
使用案例:
GET index_test/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"Dest": {
"query": "Sydney Airport",
"slop": 2,
"analyzer": "standard",
"boost":20,
"zero_terms_query":"none"
}
}
}
]
}
}
}
match_phrase_prefix
| 参数 | 含义 | 说明 |
|---|---|---|
| query | 查询短语 | 最后一个词会做前缀匹配,前面必须按顺序匹配 |
| slop | 短语间隔 | 默认 0,必须严格连续 |
| analyzer | 分词器 | 对查询文本分词 |
| max_expansions | 前缀最大扩展数 | 最后一个词最多匹配多少个前缀词(默认 50) |
使用案例
GET index_test/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase_prefix": {
"Dest": {
"query": "Sydney A",
"max_expansions": 10,
"analyzer": "standard",
"slop":3
}
}
}
]
}
}
}
multi_match
multi_match = 多字段联合检索 代替写多个 should + match,一条语句同时查多个字段,ES 专属语法糖。
核心参数:
| 参数 | 作用 | 备注 |
|---|---|---|
query |
检索文本 | 必填,会分词 |
fields |
指定查询多字段 | 核心参数,数组格式 |
boost |
字段加权 | 写法:字段名^2 如 Dest^3 |
type |
多字段匹配类型 | 核心重点,下面单独讲 |
fuzziness |
模糊纠错 | 仅 best_fields 等类型支持 |
prefix_length |
模糊固定前缀长度 | multi_match 支持 |
minimum_should_match |
最小匹配词数 | 控制匹配宽松度 |
operator |
分词逻辑 and/or | 控制多词必须全匹配 / 任意匹配 |
analyzer |
自定义分词器 | 覆盖字段默认分词器 |
type 五大匹配类型(必考)
multi_match 核心区别就在 type,默认:best_fields
- best_fields(默认)
- 场景:文章、标题、描述
- 逻辑:取单个字段最高分数为最终分
- 规则:优先匹配度最高的字段,防止多字段拉低相关性
- most_fields
- 场景:内容重复、多字段同质
- 逻辑:所有匹配字段分数相加
- 特点:匹配字段越多,分数越高
- cross_fields
- 场景:人名、地址、跨字段拆分词汇
- 逻辑:把所有字段合并成一个大文本分词匹配
- 适合:关键词分散在不同字段
- phrase
- 场景:多字段短语精确匹配
- 等价:多字段
match_phrase,支持slop
- phrase_prefix
- 场景:多字段搜索框补全
- 等价:多字段
match_phrase_prefix
案例展示:
下面给大家带来两个完全一直的DSL语句:
GET index_test/_search
{
"track_total_hits": true,
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "Sydney Kingsford Smith International",
"fields": [
"Dest",
"Origin"
]
}
}
]
}
}
}
GET index_test/_search
{
"track_total_hits": true,
"query": {
"bool": {
"should": [
{
"match": {
"Dest": "Sydney Kingsford Smith International"
}
},
{
"match": {
"Origin": "Sydney Kingsford Smith International"
}
}
]
}
}
}
combined_fields
- multi_match(默认) :以字段为中心(先找每个字段的匹配,再合并分数)
- combined_fields :以词(term)为中心(先把查询拆成词,再在所有字段里找这些词,统一算分)Elastic
类比:
-
multi_match= 分别查 Dest、Origin,再把结果拼起来 -
combined_fields= 把 Dest+Origin 拼成一个大字段,只查一次GET index_test/_search
{
"track_total_hits": true,
"query": {
"bool": {
"must": [
{
"combined_fields": {
"query": "Sydney Kingsford Smith International",
"fields": [
"Dest",
"Origin"
]
}
}
]
}
}
}