2012-09-07 65 views
6

当我尝试在布尔模式下使用带有单引号和星号通配符的字符串进行全文搜索时,例如“levi's *”,它出现问题:它似乎在搜索也适用于以“s”开头的所有单词,如“spears”,据我所知,当引号应该被认为是单词的一部分,而两个单引号('')将成为单词分隔符......但也许我错了。带有单引号的全文查询

请看看这里的例子:http://www.sqlfiddle.com/#!2/3dd3e/2/0 - 第二行should't在那里

我该怎么做我想要什么?

回答

1

这让你从你的例子中,两行:

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) 
+0

问题是,没有这个查询会发现即‘levi'strauss’时,星号在双引号之后似乎没有做任何事情(“lacost”*也不会起作用) – Borgtex

+0

我不得不说我没有使用过'MATCH()',我会用一个正则表达式代替它 –

+1

它看起来像使用括号是帮助更好....(见更新的答案) –

1

我想你应该双引号,你需要搜索,如果它包含单引号

如字符串:MATCH(value) AGAINST ('"levi\'s"* lacost*' IN BOOLEAN MODE)

0

捎带上巴特的意见处理单引号,仍然有一个搜索功能,我分别对待每学期。 所以逻辑是 - 如果一个术语有一个单引号,用圆括号包住它,否则保留它。 下面是一些PHP代码,可以帮助

$term = preg_replace("/[']/", "\'", $term); 
$terms = explode(' ',$term); 
foreach ($terms as &$t) { 
    if (strpos($t, "'")) { 
     $t = "(".$t.")"; 
    } 
} 
$term = implode(' ',$terms); 

我的比赛是AGAINST(“$长期” IN BOOLEAN MODE