首页/数据/NoSQL 速查/wildcard 与 prefix 通配查询
Elasticsearch89 条

wildcard 与 prefix 通配查询

wildcard 支持 * 与 ? 通配符,prefix 只匹配前缀;两者作用在词条层面,对 keyword 字段匹配整串,对 text 字段匹配单个词条,扫描成本随通配范围上升。

NoSQL 速查数据更新于 2026-10-13

wildcard 与 prefix 是什么

两者都属于「按模式匹配词条」的查询:wildcard 支持 * 匹配任意多个字符、? 匹配单个字符,prefix 只匹配前缀。它们作用在倒排索引的词条层面——对 keyword 字段匹配整串值,对 text 字段匹配分析后的单个词条,因此匹配范围与直觉里的模糊查找并不一样。

基本信息

通配符* 匹配任意多个字符,? 匹配单个字符,仅 wildcard 支持
prefix 查询只匹配词条前缀,效果等价于 ki* 但成本更低
大小写默认区分,wildcard 可用 case_insensitive 放宽
作用层面倒排索引词条:keyword 匹配整串,text 匹配单个词条
代价前导通配要遍历大量词条,前缀匹配可利用词条前缀索引

典型使用场景

  • 按编号前缀筛选资源:资源 ID、工单号、订单号类字段
  • 辅助查找:只记得字符串的一部分时做辅助定位
  • 日志检索:按模块名或路径前缀过滤
  • 数据清理前定位:找出符合某命名规则的文档
  • 作为过渡方案:在补建 n-gram 字段或前缀索引之前先临时用通配查询

常用写法

常用写法
# wildcard:* 任意多字符、? 单字符,默认区分大小写
GET /my-index/_search
{ "query": { "wildcard": { "user.id": { "value": "ki*y", "case_insensitive": true } } } }

# prefix:只匹配前缀,成本低于等价通配
GET /my-index/_search
{ "query": { "prefix": { "user.id": { "value": "ki" } } } }

# 纯过滤场景用 constant_score 包一层,跳过评分开销
GET /my-index/_search
{ "query": { "constant_score": { "filter": { "prefix": { "user.id": "ki" } } } } }

# 先看字段被分析成了哪些词条,确认通配到底作用在什么上
GET /my-index/_analyze
{ "field": "user.id", "text": "kitty" }

匹配面与代价

写法匹配对象代价
prefix: ki以 ki 开头的词条低,可利用词条前缀索引
wildcard: ki*y以 ki 开头、以 y 结尾的词条中等,前导通配时明显升高
wildcard: *ki任意以 ki 结尾的词条高,需要遍历全部词条
text 字段上的 wildcard单个词条内部匹配跨词的整句模式永远不会命中
以 * 开头的模式要遍历大量词条,索引词条量级大时容易拖慢集群;能用前缀匹配、n-gram 字段或 keyword 精确匹配替代时,不要使用前导通配。
wildcard 的 rewrite 参数会影响评分行为与性能,纯过滤场景用 constant_score 包一层可以跳过评分计算,也更容易命中查询缓存。

易错点

  • 在 text 字段上用 wildcard 期望跨词匹配:它只作用于单个词条,带空格的模式永远不会命中
  • 以 * 或 ? 开头的模式会遍历大量词条,查询耗时随索引规模上升,量大时容易拖慢整个集群
  • 把通配查询当成模糊纠错手段:wildcard 不做相似度匹配,拼写错误要用 fuzziness 或 match 查询解决
  • 通配查询默认区分大小写,用户搜不到结果时先确认是否需要 case_insensitive,而不是直接改索引结构

数据来源与参考

  • Elasticsearch Guide: Wildcard query
  • Elasticsearch Guide: Prefix query
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌