0

我可以做一个 MariaDB 全文查询,它搜索这样开头的单词:

select * from mytable
where match(mycol) against ('+test*' in boolean mode)>0.0;

这会找到像“test”、“tester”、“testing”这样的词。

如果我的搜索字符串包含特殊字符,我可以将搜索字符串放在引号中:

select * from mytable
where match(mycol) against ('+"test-server"' in boolean mode)>0.0;

这将找到包含字符串的所有行test-server

但似乎我不能将两者结合起来:

select * from mytable
where match(mycol) against ('+"test-serv"*' in boolean mode)>0.0;

这会导致错误:

Error: (conn:7) syntax error, unexpected $end, expecting FTS_TERM or FTS_NUMB or '*'
SQLState:  42000
ErrorCode: 1064

将“*”放在带引号的字符串中将不返回任何结果(如预期的那样):

select * from mytable
where match(mycol) against ('+"test-serv*"' in boolean mode)>0.0;

有人知道这是否是 MariaDB 的限制吗?还是一个错误?

我的 MariaDB 版本是 10.0.31

4

1 回答 1

1
WHERE MATCH(mycol) AGAINST('+test +serv*' IN BOOLEAN MODE)
  AND mycol LIKE '%test_serv%'

MATCH找到所需的行以及一些不需要的行。 然后LIKE过滤掉垃圾。由于LIKE仅将 应用于某些行,因此它的缓慢性被掩盖了。

(当然,这并不适用于所有情况。它需要一些手动操作。)

d'Artagnan- 利用

WHERE MATCH(mycol) AGAINST("+Arta*" IN BOOLEAN MODE)
  AND mycol LIKE '%d\'Artagnan%'

请注意,我使用了适当的转义将撇号放入LIKE字符串中。

因此,您的代码的算法类似于:

  1. 以同样的方式将字符串分解为“单词” FULLTEXT
  2. 扔掉任何太短的字符串。
  3. 如果没有留下任何单词,那么您将无法使用FULLTEXT并卡在慢速LIKE.
  4. 坚持*最后一个词(或每个词?)。
  5. AGAINST用这些词构建。
  6. 加上AND LIKE '%...%'原来的短语,适当地转义。
于 2018-10-26T19:54:28.620 回答