文章十九: ElasticSearch Full Text 全文本查询

match查询:

参数 含义 取值说明 默认值 备注
query 查询关键词 要搜索的文本内容 必填 你要检索的字符串
analyzer 分词器 指定对查询词分词的分析器 字段映射的分词器 如:ik_max_word/standard
minimum_should_match 最小匹配词数 分词后最少匹配几个词才算命中 1 支持数值 / 百分比,如 275%
operator 多词匹配逻辑 分词后词之间的关系 or or:满足任意;and:必须全部
boost 权重加权 对查询分数进行加权 1.0 数值越大权重越高
fuzziness 模糊匹配 允许编辑距离(容错)这个是针对于一个单词来讲的 0 不开启 AUTO12
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 百分比 / 数字,如 275%
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 字段加权 写法:字段名^2Dest^3
type 多字段匹配类型 核心重点,下面单独讲
fuzziness 模糊纠错 best_fields 等类型支持
prefix_length 模糊固定前缀长度 multi_match 支持
minimum_should_match 最小匹配词数 控制匹配宽松度
operator 分词逻辑 and/or 控制多词必须全匹配 / 任意匹配
analyzer 自定义分词器 覆盖字段默认分词器

type 五大匹配类型(必考)

multi_match 核心区别就在 type,默认:best_fields

  1. best_fields(默认)
  • 场景:文章、标题、描述
  • 逻辑:取单个字段最高分数为最终分
  • 规则:优先匹配度最高的字段,防止多字段拉低相关性
  1. most_fields
  • 场景:内容重复、多字段同质
  • 逻辑:所有匹配字段分数相加
  • 特点:匹配字段越多,分数越高
  1. cross_fields
  • 场景:人名、地址、跨字段拆分词汇
  • 逻辑:把所有字段合并成一个大文本分词匹配
  • 适合:关键词分散在不同字段
  1. phrase
  • 场景:多字段短语精确匹配
  • 等价:多字段 match_phrase,支持 slop
  1. 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"
    ]
    }
    }
    ]
    }
    }
    }

相关推荐
AI科技星1 小时前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
STER labo1 小时前
mysql配置环境变量——(‘mysql‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法)
数据库·mysql·adb
微软技术分享1 小时前
本地部署千问 2.5-1.5B-GGUF + LangChain 封装学习
数据库·学习·langchain
Justice Young2 小时前
Flink测试题目及知识点整理(一)
大数据·flink
0xDevNull2 小时前
Java泛型详解
java·开发语言·后端
嘻嘻哈哈樱桃2 小时前
牛客经典101题解题集--贪心算法+模拟
java·python·算法·贪心算法
njsgcs2 小时前
我有待做任务清单和不良操作图片集,如何设计ai agent协助我完成工作
大数据·人工智能
七夜zippoe2 小时前
DolphinDB分区策略:VALUE分区详解
数据库·oracle·分区·value·dolphindb
rKWP8gKv72 小时前
数据库连接池选型:HikariCP与Druid的性能对比
数据库