在mySQL中更有效的单词边界查询

时间:2011-08-31 18:16:25

标签: mysql regex

我有一个包含20万个短语的表格,我正在使用此查询进行单词匹配:

SELECT * FROM `searchIndex` WHERE `indexData` RLIKE '[[:<:]]Hirt'

indexData字段有一个FULLTEXT索引,是数据类型longtext。

我希望匹配

等项目

“Alois M. Hirt”

“Show Biz - Al Hirt,担任新角色,......”

“Al Hirt的Sinatraville打开9 p ......”

“Hirt将会播放...”

而不是“衬衫”或“十三”或“三十”等。

查询是成功的,但它经常需要3秒才能返回,我想知道是否有更好,更有效的方法来进行这种单词边界匹配?

如果我要为indexData添加另一个索引,那么正确使用的键长是什么?

TIA

2 个答案:

答案 0 :(得分:6)

无需拥有FULLTEXT索引。 MySQL具有字边界的特殊标记。来自MySQL doc

[[:<:]], [[:>:]]

这些标记代表字边界。它们分别匹配单词的开头和结尾。单词是一系列单词字符,其前面或后面没有单词字符。单词字符是alnum类中的字母数字字符或下划线(_)。

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';   -> 1
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';  -> 0

答案 1 :(得分:1)

setsuna的答案非常有效:

SELECT * FROM searchIndex WHERE MATCH(indexData)AGAINST('Hirt *'IN BOOLEAN MODE);