mysql 类似正则表达式的全文通配符搜索

mysql full text wildcard search like regex

到目前为止我一直在使用

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%'

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

全文搜索引擎忽略短于三个字符的词。您可以 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

根据 Gordon 的建议,您可以试试这个:

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

这将使用您的 FULLTEXT 索引来查找可能的匹配项,并使用 REGEXP 来获得更准确的结果。然后,昂贵的 REGEXP 操作可以 运行 处理更少的行。

(当你的表没有很多行时请注意 IN NATURAL LANGUAGE MODE。它会给出奇怪的结果。索引器决定哪些词太常见而不必理会,如果你的词数很少,这个决定被扭曲了。)