php - MySQL 全词匹配 – 多个词

标签 php mysql sql regex

我看了很多类似的帖子,但都没有解决我的问题,这很可能是因为我缺乏足够的知识,所以请多多包涵。

我的术语词典中的一个搜索选项是“仅限整个单词”。一开始我在用

WHERE ".$source." RLIKE '[[:<:]]".$keyword."[[:>:]]'

但是,这无法匹配第一个或第二个单词$keyword当有多个时。然后我发现

WHERE ".$source." REGEXP '[[:<:]]".$keyword."[[:>:]]'

WHERE ".$source." REGEXP '(^| )".$keyword."( |$)'

搜索时these forums

我刚刚在我的 PhpMyAdmin 中测试了以上两个,发现前者在 0.0740 秒内执行,而后者花费两倍的时间,0.1440 秒,所以我想我应该坚持前者。

最让我困扰的是结果的巨大差异,例如搜索单个词(“工具”):

  1. 使用 [[:<:]][[:>:]] PhpMyAdmin 中的单词边界返回 34 个结果。

  2. 使用 (^| )( |$)在 PhpMyAdmin 中返回 26 个结果。

  3. 在我的 PHP 脚本中运行 #1 regexp 返回 34 个结果(这是正确的数字)。

这是整个 MySQL block :

foreach($keywords as $keyword) {
    $query = $db->query("SELECT * FROM ".DICTIONARY_TABLE." " .
    "JOIN ".DICTIONARY_THEMES." ON ".DICTIONARY_TABLE.".theme_id = ".DICTIONARY_THEMES.".theme_id ".
    "LEFT JOIN ".DICTIONARY_DEFINITIONS." ON ".DICTIONARY_TABLE.".term_id = ".DICTIONARY_DEFINITIONS.".term_id ".
    "WHERE ".DICTIONARY_TABLE.".".$source." REGEXP '(^| )".$keyword."( |$)'".
    //"WHERE ".DICTIONARY_TABLE.".".$source." REGEXP '[[:<:]]".$keyword."[[:>:]]'".
    " ORDER BY ".DICTIONARY_TABLE.".theme_id, ".DICTIONARY_TABLE.".".$source."");
}

我已经注释掉了我不使用的搜索选项。

现在,如果我尝试使用两个关键字,例如“切割工具”,我仍然在页面中得到 34 个结果。我不确定我是否在 PhpMyAdmin 中做对了:

SELECT * FROM `asphodel_dictionary_terms` WHERE english REGEXP '[[:<:]]cutting[[:>:]]';
SELECT * FROM `asphodel_dictionary_terms` WHERE english REGEXP '[[:<:]]tool[[:>:]]'

这将返回“切割”的 44 个结果和“工具”的 34 个结果。使用 (^| ) 的查询...分别返回 37 + 26 个结果。

任何能帮助我解决问题的反馈都将不胜感激!

数据库在主表中总共包含 109,000 个条目,DICTIONARY_THEMES 中有 82 个主题表和 DICTIONARY_DEFINITIONS 中的 727 个条目 table 。不是一个巨大的数据库,它不会变得更大。

最佳答案

您得到不同的结果,因为这两个正则表达式不相同。

(^| )表示:字符串的开头或空格( ( |$) 在字符串末尾具有相同的含义)。

[[:<:]][[:>:]]单词边界:从概念上讲,这是指分隔单词的字符,通常正则表达式引擎将其解释为:除数字、字母或下划线之外的任何内容。

所以基本上第一个模式比第二个模式更具限制性(字符串的空格、开头和结尾单词边界,但还有其他)。

如果要搜索多个关键字,则需要重复正则表达式匹配,例如:

WHERE 
    ".$source." RLIKE '[[:<:]]".$keyword1."[[:>:]]'
    OR ".$source." RLIKE '[[:<:]]".$keyword2."[[:>:]]'

或者通过组合关键字创建一个新的正则表达式:

WHERE 
    ".$source." RLIKE '[[:<:]](".$keyword1.")|(".$keyword2.")[[:>:]]'

注意:对于搜索要求,您应该考虑使用 MySQL Full Text Search ,主要是为了搜索完整的单词而构建的(不过有一些先决条件)。

关于php - MySQL 全词匹配 – 多个词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54839862/

相关文章:

php - 在单列中管理父子层次结构

php - 在 Web 上创建电子邮件表单时的安全注意事项

PHPActiveRecord 编码问题

php - 在 react 中使用Fetch,需要用户名密码才能访问数据库

php - MySql/PHP 查询返回空

php - 我有一个 SQL 表。对于 PHP 的 SQL 请求,我想将该请求的结果存储在变量中。

mysql - 我们如何将 PostgreSQL 中的序列迁移到 Mysql

SQL 其中连接集必须包含所有值但可能包含更多

sql - 有没有办法使用 LIMIT 关键字在 Postgres 中获取一系列记录

asp.net - 如果我只是做一个查找表,我应该使用自动生成的主键吗?