Full text search 带特殊字符和“word以开头”的MariaDB全文搜索

Full text search 带特殊字符和“word以开头”的MariaDB全文搜索,full-text-search,mariadb,fulltext-index,Full Text Search,Mariadb,Fulltext Index,我可以进行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 boole

我可以进行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;
这将查找包含字符串测试服务器的所有行

但我似乎无法将两者结合起来:

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的限制吗?还是虫子

我的版本是10.0.31

WHERE MATCH(mycol) AGAINST('+test +serv*' IN BOOLEAN MODE)
  AND mycol LIKE '%test_serv%'
匹配将找到所需的行以及一些不需要的行。然后诸如此类的东西会过滤掉无用的东西。因为LIKE只应用于某些行,所以它的慢度被掩盖了

诚然,这并不适用于所有情况。它需要一些人工操作

d'Artagnan-使用

注意,我使用了合适的转义将撇号放入类似的字符串中

因此,代码的算法如下所示:

将字符串按全文相同的方式拆分为单词。 扔掉任何太短的绳子。 如果没有留下任何单词,那么您就不能使用全文,只能使用慢速的LIKE。 在最后一个单词或每个单词后粘贴*?。 用这些话来建立一个对照。 附加组件并与“…%”类似,使用原始短语,适当转义。
谢谢,这将有助于解决这个问题。但这是一个普遍的问题:例如,搜索d'Artagnan:如果输入了字符串d'Arta,我就无法执行这样的搜索:在布尔模式>0.0的情况下,将mycol与+d'Arta*匹配。你知道关于如何处理这些特殊字符的任何文档/最佳实践指南吗?@wknauf-我在回答中回答。思考了一会儿之后,我将您的建议应用到我们的代码中,它是有效的。看来这是官方的解决办法;-。非常感谢!
WHERE MATCH(mycol) AGAINST("+Arta*" IN BOOLEAN MODE)
  AND mycol LIKE '%d\'Artagnan%'