MySQL正则表达式全文通配符搜索

时间:2018-10-10 11:34:47

标签: mysql sql full-text-indexing

到目前为止,我一直在使用

WHERE col REGEXP 'IN (.*) WE TRUST'

但是自从将全索引搜索添加到此列以来,此查询就非常慢。

我想知道如何使用全文本索引搜索来实现通配符搜索。

这是我一直在使用的两个查询,但是我仍然得到很多意外的结果,而且根本不确定为什么我的查询会提取这些结果。

WHERE MATCH (markIdentification) AGAINST ('IN (.*) WE TRUST')
WHERE MATCH (markIdentification) AGAINST ('+IN (.*) +WE +TRUST')
WHERE MATCH (markIdentification) AGAINST ('+IN * +WE +TRUST')

这些是唯一看起来甚至更接近的。 有什么建议么?

谢谢

问题参考更新:

SELECT * from table
 WHERE MATCH (col) AGAINST ('+IN * +WE +TRUST')
   AND col LIKE '%IN (.*) WE TRUST%'

这是正确的吗? 如果没有,那你会怎么做?

1 个答案:

答案 0 :(得分:1)

FULLTEXT搜索引擎将忽略少于三个字符的单词。您可以set the innodb_ft_min_token_size option进行更改,然后重新生成FULLTEXT索引。

AGAINST中的+(和-)语法是boolean search mode。所以要使用+,您需要

WHERE MATCH (markIdentification) AGAINST ('+IN +WE +TRUST' IN BOOLEAN MODE )

BOOLEAN模式具有许多特殊字符来控制搜索,但是*本身不是其中之一。您可以说'TRUST*'来匹配trusttrusteetrusted

根据戈登的建议,您可以尝试以下方法:

WHERE MATCH (markIdentification) AGAINST ('+IN +WE +TRUST' IN BOOLEAN MODE )
  AND  markIdentification REGEXP 'IN (.*) WE TRUST'

这将使用您的FULLTEXT索引查找可能的匹配项,并使用REGEXP获得更准确的结果。这样,昂贵的REGEXP操作就可以在更少的行上运行。

(请注意IN NATURAL LANGUAGE MODE,如果您的表中没有很多行。它可能会产生奇怪的结果。索引器会确定哪些单词太常见而无聊,如果您的单词数量少,则该决定变得失真。)