当前位置:首页 > 云服务器 > 正文

非关系型数据库通配符

非关系型数据库中的通配符机制

通配符在不同非关系型数据库中用于模式匹配、索引覆盖或查询筛选,其实现和语义差异较大,以下按数据库类型分别说明主要用法。

文档型数据库 MongoDB

通配符索引

MongoDB 支持通配符索引(Wildcard Index),能够对文档中所有字段或指定路径下的字段建立索引,适用于字段名不固定或查询模式未知的场景。

  • 创建语法:db.collection.createIndex( { "$" : 1 } ) 或 { "path.$" : 1 }
  • 支持单字段、多字段及复合通配符索引。
  • 通配符索引会覆盖文档中所有字段(包括嵌套文档),但无法用于 $text、$geo 等特殊查询。

正则表达式通配符

在查询条件中使用正则表达式,利用 或 ^ 等模式匹配字符串内容。

  • 示例:db.collection.find( { field: /pattern/ } ) 或 { field: { $regex: "pattern" } }
  • 非索引字段上的正则查询可能导致全表扫描,建议结合索引使用前缀表达式。

键值数据库 Redis

键模式匹配(KEYS 与 SCAN)

Redis 提供 KEYS pattern 和 SCAN cursor [MATCH pattern] 命令,支持通配符模式:

| 通配符 | 含义 | 示例 |

|——–|——|——|

| | 匹配任意数量字符 | keys user: |

| | 匹配单个字符 | keys user:?? |

| [abc] | 匹配方括号内任意字符 | keys user:[a-c] |

| x | 转义特殊字符 | keys user:? |

注意事项

非关系型数据库通配符 第1张

非关系型数据库通配符 第2张

  • KEYS 会阻塞 Redis 单线程,生产环境应使用 SCAN 迭代。
  • SCAN 的 MATCH 在每个迭代中应用模式,但返回结果可能包含不匹配项(客户端过滤)。

搜索引擎 Elasticsearch

通配符查询(Wildcard Query)

用于匹配字段值中通配符模式,常用于部分匹配或模糊搜索。

非关系型数据库通配符 第3张

  • 匹配零个或多个字符(不跨词)。
  • 匹配单个字符。
  • 示例:{ "wildcard": { "field": "tet" } }
  • 可通过 rewrite 参数控制重写方式以优化性能。
  • 在大数据量下通配符查询可能较慢,建议使用 ngram 或 edge_ngram 分词器替代。

正则查询(Regexp Query)

支持更复杂的模式,语法基于 Lucene 正则表达式。

  • 示例:{ "regexp": { "field": "pattern" } }
  • 通配符查询本身是正则查询的特例,但正则查询功能更强大,性能开销也更大。

列族数据库 Cassandra

CQL 中的 LIKE 操作

Cassandra 的 CQL 提供 LIKE 操作符,但仅支持 通配符,且只能用于聚类列(clustering column)或二级索引列(需开启 LIKE 支持)。

  • 匹配任意数量字符,_ 匹配单个字符(CQL 3.11 后支持)。
  • 示例:SELECT FROM table WHERE clustering_column LIKE 'prefix%'
  • 性能:LIKE 'prefix%' 可利用聚类列前缀匹配,但 %prefix% 或 %suffix 会导致全表扫描。

其他数据库简表

数据库类型 通配符机制 备注
Couchbase WILDCARD 操作符(N1QL) 支持 和 _,类似 SQL
HBase 行键前缀扫描(PrefixFilter) 不直接支持通配符,但可通过 Scan 的 setRowPrefixFilter 实现
Neo4j 字符串匹配(CONTAINS, STARTS WITH, ENDS WITH) 无通配符,但支持正则表达式()


相关问题与解答

问题 1:在 MongoDB 中,通配符索引与普通索引相比有哪些优缺点?

解答

  • 优点:通配符索引无需提前指定字段名,适合字段名动态变化的集合(如日志、用户自定义属性);可覆盖所有字段,减少索引数量。
  • 缺点:索引体积较大(存储所有字段的键值);无法针对特定字段优化查询性能;不支持 $text、$geo 等特殊索引类型;复合索引中通配符部分只能放在末尾。

问题 2:Redis 的 KEYS 命令为什么被建议避免在生产环境使用?

解答

KEYS 命令会扫描整个键空间,返回所有匹配的键,在键数量较多时(例如百万级)会阻塞 Redis 单线程,导致其他命令无法执行,可能引发服务中断或超时,最佳实践是使用 SCAN 命令配合 MATCH 模式,以游标方式增量迭代,避免阻塞。

0