【问题标题】:More efficient word boundary query in mySQLmySQL 中更高效的词边界查询
【发布时间】:2011-08-31 18:16:24
【问题描述】:

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

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

indexData 字段有一个 FULLTEXT 索引并且是长文本数据类型。

我想匹配类似的项目

“阿洛伊斯·M·赫特”

“Show Biz - Al Hirt,在一个新角色中,......”

“Al Hirt 的 Sinatraville 晚上 9 点开放...”

“Hirt 正在播放...”

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

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

如果我要向 indexData 添加另一个索引,正确的 keylength 应该是多少?

TIA

【问题讨论】:

  • 尝试使用 FULLTEXT 搜索先跟正则表达式
  • SELECT * FROM searchIndex WHERE MATCH (indexData) 反对(布尔模式下的'Hirt*');
  • 谢谢setsuna!该客户现在有一名内部开发人员。我已经把这个传给他了。
  • @jerrygarciuh 如果这个问题已经得到解答,那么您应该自己给出答案,或者完全删除它。
  • 我有类似的问题,但在我的情况下,短语也可能是多词。在正则表达式检查之前添加一个类似检查 (... LIKE '%phrase%' AND ...) 可以大大提高速度(因此只有在文章中有短语时才检查正则表达式)。

标签: mysql regex


【解决方案1】:

不需要 FULLTEXT 索引。 MySQL 有单词边界的特殊标记。来自MySQL doc

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

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

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

【讨论】:

    【解决方案2】:

    setsuna的回答效果很好:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2011-03-09
      • 2011-09-03
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多