到目前为止,我一直在使用
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%'
这是正确的吗? 如果没有,那你会怎么做?
答案 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*'
来匹配trust
,trustee
和trusted
。
根据戈登的建议,您可以尝试以下方法:
WHERE MATCH (markIdentification) AGAINST ('+IN +WE +TRUST' IN BOOLEAN MODE )
AND markIdentification REGEXP 'IN (.*) WE TRUST'
这将使用您的FULLTEXT索引查找可能的匹配项,并使用REGEXP获得更准确的结果。这样,昂贵的REGEXP操作就可以在更少的行上运行。
(请注意IN NATURAL LANGUAGE MODE
,如果您的表中没有很多行。它可能会产生奇怪的结果。索引器会确定哪些单词太常见而无聊,如果您的单词数量少,则该决定变得失真。)