【发布时间】:2019-07-17 07:15:04
【问题描述】:
我看过不少类似的帖子,但都没有解决我的问题,这很可能是因为我缺乏足够的知识,所以请多多包涵。
我的术语词典中的一个搜索选项是“仅全词”。一开始我用的是
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 正则表达式会返回 34 个结果(这是正确的数字)。
这是整个 MySQL 块:
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个条目。不是一个巨大的数据库,它不会变得更大。
【问题讨论】:
-
keyword( |$)不匹配keyword.或keyword,。 -
keyword(\.|,| |$)会这样做吗?我不擅长正则表达式,对不起,如果这是一个愚蠢的问题。 -
我不是正则表达式专家。将 [regex] 标签添加到您的问题中,并希望@WiktorStribiżew 能找到它:-)
-
这个帖子没有问题。您正在将苹果与橙子进行比较,因为这两个正则表达式旨在匹配不同上下文中的单词。一种基于单词边界,另一种使用空白边界。由您决定您需要什么,只有在此之后您才能尝试优化。在 MySQL 中,您将无法进行太多优化,它的正则表达式引擎太“基础”。