Full text query with a single quote

主宰稳场 提交于 2019-12-18 08:11:51

问题


I'm having a problem when I try to do a full text search in boolean mode using a string with a single quote and an asterisk wildcard, i.e. "levi's*": it seems to search also for all words beginning with "s", like "spears", when, as far as I know, the quote should be considered part of the word while two single quotes ('') would be a word separator... but maybe I'm wrong.

Please, look at the example here: http://www.sqlfiddle.com/#!2/3dd3e/2/0 - the second row should't be there

how can I do what I want?


回答1:


this gives you the two rows from your example:

SELECT  *
FROM    ft
WHERE   MATCH(value) AGAINST ('"levi\'s" lacost*' IN BOOLEAN MODE)

In http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html at the end, it talks about exact matches in double quotes. You then just escape the single quote and you are done.

Using parentheses, you can add the asterisk:

WHERE   MATCH(value) AGAINST ('(levi\'s)* lacost*' IN BOOLEAN MODE)



回答2:


I guess you should double quote the string you need to search for if it contains single quotes

Eg: MATCH(value) AGAINST ('"levi\'s"* lacost*' IN BOOLEAN MODE)




回答3:


Piggy backing on Bart's comment to handle the single quote and still have the search function as a like, I treated each term separately. So the logic is - if a term has a single quote, wrap it with parenthesis, otherwise leave it. Here is some php code that may help

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

my match is AGAINST('$term' IN BOOLEAN MODE



来源:https://stackoverflow.com/questions/12316209/full-text-query-with-a-single-quote

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!