2012-09-07 31 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