我有一个包含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
答案 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);