2016-11-30 28 views
0

これは私の灰白色の問題を私が読んで、mysqlを通り抜けていて、さまざまなオプションを見ているだけです。フルテキストmysqlの検索と一致する正確な文字列

要するに、私はタグクラウドを作っており、その過程の一部は、その単語が存在するかどうかを確認することです。もしそうなら+1となりますが、それは正確なフレーズでなければなりません。

私は全文検索が最良の選択であると考えました。

例としてです。

$string = "hair dryer"; 

$string = '"'.$string.'"'; //enclose string in quotation marks to define must be an exact match 



//$string = mysqli_real_escape_string($mysqli,$string); // removed to see if this was effecting the result. 

$sql = "SELECT * FROM `search_keyword` WHERE Match (`keyword`) Against ('$string' IN BOOLEAN MODE) LIMIT 1"; 
$result=mysqli_query($mysqli,$sql); 

だから、テストは、私は言葉「ヘアドライヤー」の行を持って、それはそれと一致してDBにあった - 私は「髪」それはまだ引き出しに文字列を変更する場合は良い結果

正確に一致しないようにしてはいけない "ヘアドライヤー"。

私はこれをすべて試してみると、間違った結果になります。

(
[0] => Array 
    (
     [keyword] => hair dryer 
     [id] => 25 
    ) 

) /// should be empty and hair as a single row is not found 

何かアドバイスはあなたがPHPでそれを行うことができ

+0

なぜ、 'SELECT count(*)FROM ... WHERE Keyword = $ string'ではないのですか?特定のマッチだけが必要な場合。 – Mruf

+0

はい、その方法を使用していますが、何らかの理由で既存の単語を拾い上げることができず、そうでなければ別の単語を追加します。私はフルテキストを使用すると、より正確な方法が得られ、重複を作成しないと考えました。私は、正確に一致するものだけを引き出すクエリを得るのがなぜ難しいように思われるのか混乱しています。 –

+0

あなたの問題を正しく理解していれば、全文検索は正しい方向ではありません。なぜなら、フルテキストが逆索引を作成していても、制限文字数制限を1に設定しても 'ヘアドライヤー'と一致することになります。 trim、strtolowerのようなクエリの前にキーワードを処理するようなPHPで作業する必要があります。SELECT count(*)FROM ... WHERE Keyword = trim($ string)またはキーワードフィールドのグループクエリ。 –

答えて

0

:-)歓迎されてください。最初に文字列を配列に変換し、両方の配列を比較して一致するものがあるかどうかを調べます。

 $string = explode(" ",$string); 
     $sql = "SELECT keyword FROM search_keyword"; 
    $result=mysqli_query($mysqli,$sql); 
$compareArrays = array_intersect($result,$string); 
     if (is_array($compareArrays) && count($compareArrays) > 0) { 

$ compareArraysが1よりもgreaterなので、結果が得られます。これは完全一致を意味します。 array_intersectは2つのarrraysを比較し、完全一致があるかどうかを調べます。この方法では、私はあなたが文字列として '髪'と一致するだろうとは思わないが、あなたは 'ヘアドライヤー'で1つを得るだろう。これは機能しますか?

関連する問題