当我尝试使用带有单引号和星号通配符的字符串(即“levi's*”)在布尔模式下进行全文搜索时遇到问题:它似乎也在搜索所有以“s”开头的单词,就像“矛”一样,据我所知,引号应该被视为单词的一部分,而两个单引号('')将是单词分隔符......但也许我错了。
请看这里的例子:http ://www.sqlfiddle.com/#!2/3dd3e/2/0 - 第二行不应该在那里
我怎么能做我想做的事?
当我尝试使用带有单引号和星号通配符的字符串(即“levi's*”)在布尔模式下进行全文搜索时遇到问题:它似乎也在搜索所有以“s”开头的单词,就像“矛”一样,据我所知,引号应该被视为单词的一部分,而两个单引号('')将是单词分隔符......但也许我错了。
请看这里的例子:http ://www.sqlfiddle.com/#!2/3dd3e/2/0 - 第二行不应该在那里
我怎么能做我想做的事?
我想你应该双引号你需要搜索的字符串,如果它包含单引号
例如:MATCH(value) AGAINST ('"levi\'s"* lacost*' IN BOOLEAN MODE)
这为您提供了示例中的两行:
SELECT *
FROM ft
WHERE MATCH(value) AGAINST ('"levi\'s" lacost*' IN BOOLEAN MODE)
在最后的http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html中,它讨论了双引号中的完全匹配。然后,您只需转义单引号即可。
使用括号,您可以添加星号:
WHERE MATCH(value) AGAINST ('(levi\'s)* lacost*' IN BOOLEAN MODE)
支持 Bart 的评论来处理单引号,并且仍然具有类似的搜索功能,我分别处理了每个术语。所以逻辑是 - 如果一个术语有一个单引号,用括号括起来,否则留下它。这是一些可能有帮助的php代码
$term = preg_replace("/[']/", "\'", $term);
$terms = explode(' ',$term);
foreach ($terms as &$t) {
if (strpos($t, "'")) {
$t = "(".$t.")";
}
}
$term = implode(' ',$terms);
我的比赛是反对(' $term '在布尔模式下