You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中通过regex、levenshtein距离等方法查询相似字符串?

问题原因

LIKE和原生REGEXP都属于精确子串匹配,只有查询内容完整出现在存储的dialogue字段中才会返回结果。你数据库中存储的是I'm too big to forget,查询语句里携带的history/really/today等字段是存储内容里不存在的,自然返回0条结果。

可用解决方案
  • 方案1:分词模糊匹配(改动最小,无需额外插件)

    先把用户输入的$dialogue拆分为独立关键词,剔除停用词(比如to、too这类无意义虚词,可根据业务规则自定义过滤规则),再用多条件模糊匹配,示例代码:

    // 拆分查询字符串为关键词数组
    $keywords = preg_split('/\s+/', $dialogue);
    // 过滤长度过短、无检索意义的词,这里示例保留长度大于2的词
    $keywords = array_filter($keywords, function($kw){
        return mb_strlen($kw) > 2;
    });
    // 拼接SQL查询条件
    $conditions = [];
    foreach($keywords as $kw){
        $conditions[] = "dialogue LIKE '%".addslashes($kw)."%'";
    }
    $sql = "SELECT sense FROM table WHERE ".implode(' AND ', $conditions);
    

    该方案无需修改数据库配置,适配大部分轻量检索场景。

  • 方案2:数据库全文索引(性能更优,适配中大数据量)

    如果你使用MySQL、PostgreSQL这类主流数据库,直接给dialogue字段创建全文索引,调用内置全文匹配函数即可自动处理词序、部分词匹配的场景:

    • MySQL 示例:
      第一步创建索引:ALTER TABLE table ADD FULLTEXT INDEX idx_dialogue (dialogue);
      第二步查询语句:
      SELECT sense FROM table 
      WHERE MATCH(dialogue) AGAINST ('$dialogue' IN NATURAL LANGUAGE MODE);
      
      查询结果会默认按相似度排序,匹配度越高的结果越靠前。
    • PostgreSQL可通过tsvector+tsquery实现相同逻辑,适配性更强。
  • 方案3:编辑距离匹配(适配短文本场景,即你查询的莱文斯坦距离方案)

    如果你的dialogue字段均为长度<100的短文本,莱文斯坦距离完全适配该场景,它会计算两个字符串的字符差异度,差异越小相似度越高。
    MySQL可安装lib_mysqludf_preg插件或导入自定义levenshtein函数(部分高版本MySQL已内置支持),查询示例:

    SELECT sense, levenshtein(dialogue, '$dialogue') AS dist 
    FROM table 
    HAVING dist < 10 -- 阈值可根据文本长度调整,数值越小匹配精度越高
    ORDER BY dist ASC;
    

    注意该方案全表计算性能较差,适合小数据量场景,也可配合分词/全文索引先过滤出候选集再计算编辑距离,大幅提升检索效率。

内容的提问来源于stack exchange,提问作者Jonas Anton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:24:01