当前位置:首页 > 问答 > 正文

数据库里怎么搞多字段模糊查找,技巧和方法分享给你

说到在数据库里进行多字段的模糊查找,这几乎是每个和数据库打交道的人都会遇到的活儿,你想在一个客户表里,找名字里带“张”、电话区号是“0755”、并且地址里包含“科技园”的所有记录,这种需求单靠一个字段的查找肯定不行,得把几个条件组合起来,下面我就分享一些实用的技巧和方法,咱们用大白话讲清楚。

最基础也是最常用的方法,就是使用 SQL 语言中的 LIKE 关键字和 ORAND 这些逻辑运算符进行组合。

LIKE 就是用来做模糊匹配的,它配合同配符使用,最常用的通配符是百分号 ,代表任意长度的任意字符(包括零个字符)。LIKE '%张%' 就能找出所有包含“张”字的记录。

当你需要在多个字段里查找同一个关键词时,用 OR 连接是最直观的,举个例子,你有一个文章表,里面有标题(title)summary)内容(content)三个字段,现在你想找出所有提到“人工智能”的文章,不管这个词出现在标题、摘要还是内容里,你的 SQL 语句可以这么写:

SELECT * FROM articles
WHERE title LIKE '%人工智能%'
   OR summary LIKE '%人工智能%'
   OR content LIKE '%人工智能%';

这条语句的意思就是:从文章表里选出那些记录,只要标题、内容其中任何一个字段包含了“人工智能”这个词,就把它找出来。

但有时候需求会更复杂一点,比如老板说:“我要找的是标题里必须有‘发布会’,同时内容里还得提到‘新品’的文章。” 这时候,多个条件不是“或”的关系,而是“且”的关系了,你就得把 OR 换成 AND

SELECT * FROM articles
WHERE title LIKE '%发布会%'
  AND content LIKE '%新品%';

这个方法简单直接,对付简单的多字段查询足够了,但它的缺点也很明显,尤其是当数据量非常大或者查询条件复杂的时候,性能可能会成为大问题,因为 LIKE '%关键词%' 这种写法是没办法使用数据库的普通索引的(除非是特定支持的前缀索引),数据库需要对每一条记录的每一个被查询的字段进行全表扫描,速度自然快不起来。

为了解决性能问题,也为了应对更复杂的搜索需求(比如分词、相关度排序),我们会用到更高级的方法,也就是引入专业的全文搜索引擎。

这可以说是处理海量文本数据模糊查找的“终极武器”,常见的全文搜索引擎有 MySQL 自带的 FULLTEXT 索引、Elasticsearch、Solr 等,它们的核心思想不再是简单的字符匹配,而是先对文本内容进行“分词”,然后对分词结果建立倒排索引,这样查询速度会呈数量级提升。

还拿上面找文章的例子来说,如果在 MySQL 中,你可以给 title, summary, content 这三个字段建立一个联合的 FULLTEXT 索引,然后你的查询语句就可以变样了:

SELECT * FROM articles
WHERE MATCH(title, summary, content) AGAINST('人工智能' IN NATURAL LANGUAGE MODE);

这条语句的作用和之前用 OR 连接的那个例子类似,但底层机制完全不同,数据库引擎会使用全文索引快速定位到包含“人工智能”的记录,效率高得多,全文搜索还能自动帮你按相关度进行排序,最相关的结果排在最前面,这是简单 LIKE 查询做不到的。

对于超大规模、要求极高的搜索场景,企业通常会选择 Elasticsearch 这类独立的搜索引擎,它的功能更强大,比如可以轻松处理错别字(模糊匹配)、同义词、高亮显示搜索关键词、复杂的聚合分析等,实现方式一般是将数据库中的数据实时或准实时地同步到 Elasticsearch 中,所有的查询操作都在 Elasticsearch 中进行,数据库只负责存储核心事务数据。

除了上面两种主流方法,还有一些根据实际情况“变通”的技巧。

  1. 预处理和冗余字段:如果有些组合查询条件特别频繁,但涉及的字段又很多,可以考虑在数据入库时,就专门新建一个“搜索关键词”冗余字段,把用户的名字、城市、职位等关键信息用空格连起来,存到一个叫 search_keywords 的字段里,这样,多字段查询就退化成了对这个单一字段的查询:WHERE search_keywords LIKE '%张%深圳%经理%',这种方法牺牲了一点存储空间,换来了查询的简便和一定的性能提升,但不够灵活。

  2. 使用正则表达式:一些数据库(如 PostgreSQL、MySQL 的高版本)支持更强大的正则表达式查询(REGEXPRLIKE),它可以实现比 LIKE 更复杂的模式匹配,你想找名字以“张”或“王”开头的客户:WHERE name REGEXP '^(张|王)',不过要注意,正则表达式通常比 LIKE 更耗资源,谨慎使用。

总结一下该怎么选:

  • 数据量小,查询简单偶尔用用:直接用 LIKE + OR/AND 组合,省事。
  • 数据量中等,搜索是核心功能,且希望有相关度排序:优先考虑数据库自带的全文索引(如 MySQL FULLTEXT)。
  • 数据量巨大,搜索要求高(要快、要准、要智能):毫不犹豫地引入 Elasticsearch 等专业搜索引擎。
  • 有非常特定的、固定的多字段组合查询模式:可以考虑使用冗余字段来简化查询。

最后提一个很重要的点,无论用哪种方法,尽量不要在模糊查询的条件前加通配符,也就是避免 LIKE '%xxx',尤其是 LIKE '%xxx%',因为这会完全阻止索引的使用,如果可能,尽量使用 LIKE 'xxx%' 这种前缀匹配,这样有些数据库还能利用上索引,在全文搜索中就不存在这个问题了。

希望这些实实在在的技巧能帮到你,让你在对付数据库的多字段模糊查找时,心里更有底。

数据库里怎么搞多字段模糊查找,技巧和方法分享给你