一重引用符とアスタリスク ワイルドカードを含む文字列を使用してブール モードで全文検索を実行しようとすると、問題が発生します。 「槍」のように、私が知る限り、引用符は単語の一部と見なされるべきですが、2 つの単一引用符 ('') は単語の区切り文字になります...しかし、おそらく私は間違っています。
ここの例を見てください: http://www.sqlfiddle.com/#!2/3dd3e/2/0 - 2行目はそこにあるべきではありません
どうすればやりたいことができますか?
一重引用符とアスタリスク ワイルドカードを含む文字列を使用してブール モードで全文検索を実行しようとすると、問題が発生します。 「槍」のように、私が知る限り、引用符は単語の一部と見なされるべきですが、2 つの単一引用符 ('') は単語の区切り文字になります...しかし、おそらく私は間違っています。
ここの例を見てください: http://www.sqlfiddle.com/#!2/3dd3e/2/0 - 2行目はそこにあるべきではありません
どうすればやりたいことができますか?
一重引用符が含まれている場合は、検索する必要がある文字列を二重引用符で囲む必要があると思います
例えば:MATCH(value) AGAINST ('"levi\'s"* lacost*' IN BOOLEAN MODE)
これにより、例から2行が得られます。
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)
一重引用符を処理し、検索機能をlikeとして保持するという Bart のコメントを参考にして、各用語を個別に扱いました。したがって、論理は、用語に一重引用符がある場合は括弧で囲み、そうでない場合はそのままにします。ここに役立つかもしれないいくつかのphpコードがあります
$term = preg_replace("/[']/", "\'", $term);
$terms = explode(' ',$term);
foreach ($terms as &$t) {
if (strpos($t, "'")) {
$t = "(".$t.")";
}
}
$term = implode(' ',$terms);
私の試合は AGAINST(' $term ' IN BOOLEAN MODE