mysql全文通配符搜索

uyhoqukh  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(439)

到现在为止我一直在用

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

是这样吗?如果没有,你会怎么做?

ylamdve6

ylamdve61#

全文搜索引擎忽略短于三个字符的单词。你可以设置 innodb_ft_min_token_size 选项,然后重新生成全文索引。
anticle中的+(和-)语法是布尔搜索模式。所以要使用+你需要

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

布尔模式有很多特殊字符来控制搜索,但是 * 孤独不是其中之一。你可以说 'TRUST*' 匹配 trust , trustee ,和 trusted .
按照戈登的建议,你可以试试这个:

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

这将使用全文索引查找可能的匹配项,并使用regexp获得更精确的结果。因此,昂贵的regexp操作可以在更少的行上运行。
(当心 IN NATURAL LANGUAGE MODE 当您的表没有很多行时。它会产生奇怪的结果。索引器决定哪些词太常见而不必费心处理,如果你有少量的词,这个决定就会被扭曲。)

相关问题