我看了很多类似的帖子,但都没有解决我的问题,这很可能是因为我缺乏足够的知识,所以请多多包涵。
我的术语词典中的一个搜索选项是“仅限整个单词”。一开始我在用
WHERE ".$source." RLIKE '[[:<:]]".$keyword."[[:>:]]'
但是,这无法匹配第一个或第二个单词$keyword
当有多个时。然后我发现
WHERE ".$source." REGEXP '[[:<:]]".$keyword."[[:>:]]'
和
WHERE ".$source." REGEXP '(^| )".$keyword."( |$)'
搜索时these forums
我刚刚在我的 PhpMyAdmin 中测试了以上两个,发现前者在 0.0740 秒内执行,而后者花费两倍的时间,0.1440 秒,所以我想我应该坚持前者。
最让我困扰的是结果的巨大差异,例如搜索单个词(“工具”):
使用
[[:<:]]
和[[:>:]]
PhpMyAdmin 中的单词边界返回 34 个结果。使用
(^| )
和( |$)
在 PhpMyAdmin 中返回 26 个结果。在我的 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/