0

全文検索クエリが完全一致以外のすべてに一致しているように見えるという奇妙な状況に直面しています...

入力が次の場合を意味します:

エンパイアトータルウォー

それは次のように一致します:

エンパイアトータルウォーリミテッドエディション
...データベースには正確に言うレコードがありますが:エンパイアトータルウォー

これは私の質問です:

     $query_GID = "SELECT game, gameID, 
    MATCH (game) AGAINST ('$game_title') AS score 
FROM gkn_catalog_match WHERE MATCH (game) AGAINST
  ('$game_title');";
$result_GID = $dbc->query($query_GID);
$row_GID = mysqli_fetch_array($result_GID,MYSQLI_ASSOC);

デバッグの目的で、私は先に進み、返された配列に一致するすべての選択肢を出力するようにこのコードを記述しましたが、完全に一致するものはその中にありません...

$GID = $row_GID['gameID'];
$GName = $row_GID['game'];
$Gscore = $row_GID['score'];
$max_score = 0;
$data = array();
while($row_GID = mysqli_fetch_assoc($result_GID)) {
if($row_GID['score'] > $max_score){ $max_score = $row_GID['score']; } //because we are ordering by score we can assume on the first run this wil be the max score.
echo "<br><b>Alternatives: " .$row_GID['game']."".@number_format(($row_GID['score']/$max_score)*100,0)."%</b>\n";

}

私の質問は、入力文字列とデータベースのレコードが同一であるのに、なぜ希望/完全一致が得られないのですか?
また、配列を出力したとしても、配列内のどこにも見つからないため、完全一致がデータベースから取得されていないようです。

編集:

データベース内のシチュエーションレコードの例:

Crysis
Crysis 2
Crysis 2 Maximum Edition
Crysis 3
Crysis 3 Hunter Edition

検索文字列(入力):
クエリによって返されたCrysis 3一致:Crysis 3 Hunter Edition

Crysis 3は一致していません。代わりに、Crysis 3 Hunter Editionのような別のレコードが一致しています。これは、Crysis3と一致させたいので予期しないことです。

このクエリの$row配列を出力すると、Crysis 3が含まれていないことがわかります。
代替案:Crysis 3 Hunter Edition 100%
代替案:Crysis 2 Maximum Edition 82%
代替案:Crysis 70%
代替案:Far Cry 3 Deluxe Edition 32%
代替案:Far Cry 2 Fortune Edition 32%
代替案:SimCity 4 Deluxe Edition 31%
代替案:SimCity Limited Edition 31%
代替案:Battlefield 3 Premium Edition 31%
代替案:Battlefield 3 Limited Edition 31%
代替案:Civilization 5 Gold Edition 31%

編集2:

クエリを手動で入力すると、目的の結果が返されます。
したがって、クエリは機能しているように見えますが、返された配列の最初のエントリが失われたようです...

4

1 に答える 1

0

ループの配列割り当てoutsideを移動することで問題を解決しました。これで、全文クエリは、データベース内に存在する場合、最大99.9%のゲームタイトルと一致します。while

そうでなければ、それはちょっとクレイジーになります。

于 2013-03-11T16:43:15.723 に答える