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*'
来匹配 trust
、trustee
和 trusted
。
根据 Gordon 的建议,您可以试试这个:
WHERE MATCH (markIdentification) AGAINST ('+IN +WE +TRUST' IN BOOLEAN MODE )
AND markIdentification REGEXP 'IN (.*) WE TRUST'
这将使用您的 FULLTEXT 索引来查找可能的匹配项,并使用 REGEXP 来获得更准确的结果。然后,昂贵的 REGEXP 操作可以 运行 处理更少的行。
(当你的表没有很多行时请注意 IN NATURAL LANGUAGE MODE
。它会给出奇怪的结果。索引器决定哪些词太常见而不必理会,如果你的词数很少,这个决定被扭曲了。)
到目前为止我一直在使用
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*'
来匹配 trust
、trustee
和 trusted
。
根据 Gordon 的建议,您可以试试这个:
WHERE MATCH (markIdentification) AGAINST ('+IN +WE +TRUST' IN BOOLEAN MODE )
AND markIdentification REGEXP 'IN (.*) WE TRUST'
这将使用您的 FULLTEXT 索引来查找可能的匹配项,并使用 REGEXP 来获得更准确的结果。然后,昂贵的 REGEXP 操作可以 运行 处理更少的行。
(当你的表没有很多行时请注意 IN NATURAL LANGUAGE MODE
。它会给出奇怪的结果。索引器决定哪些词太常见而不必理会,如果你的词数很少,这个决定被扭曲了。)