2012-03-06 30 views
0

私はデータベースを検索し、ユーザーが入力した検索文字列に基づいて一致を返すmysql/phpクエリを持っていますが、タイトルは昇順でソートされますが、それはベストマッチでソートされているようです(ElasticSearchの検索結果とスコアのランク付け方法に似ています)。 "地震II" を検索する際に現在mysql/php検索結果の順序を整える

は、結果リストには、次のようになります。

- Quake 
- Quake 4 
- Quake II 
- Quake III Arena 

期待される結果リストでなければなりません:

- Quake II (corresponding exactly to the search) 
- Quake III Arena (containing entirely the search) 
- Quake 
- Quake 4 

現在のPHP/MySQLのクエリは次のとおりです。

$nameKeys = explode(" ", $gamenamethathasbeensearchedfor); 
$query = "SELECT id FROM games WHERE GameTitle LIKE '%$nameKeys[0]%'"; 
for($i = 1; $i <= count($nameKeys); $i++) 
{ 
    if($nameKeys[$i] != "" || $nameKeys[$i] != " " || $nameKeys[$i] != " " || $nameKeys[$i] != " ") 
    { 
     $query .= " AND GameTitle LIKE '%$nameKeys[$i]%'"; 
    } 
} 
+2

MySQL Full-text functionsをチェックアウトをお勧めします'マッチ。 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html –

+0

Mysqlの全文検索機能をご覧ください – Kurt

答えて

2

GameTitleにFullTextインデックスを設定すると、MySQLのフル機能を利用できます複雑なクエリを書くことなく、テキストを並べ替えて並べ替えることができます。つまり、InnoDBを使用していない場合です。あなたは、同様にこのような何かを行うことができ

SELECT id, MATCH (GameTitle) AGAINST ('%$nameKeys[$i]%') AS SCORE FROM games WHERE MATCH (GameTitle) AGAINST ('%$nameKeys[$i]%') limit 10; 

これはあなたのインデックスを変更せずに非常に近い取得する必要が、私はあなたが「最高のためのフルテキスト検索に切り替える必要があり

+0

あなたの返信をありがとう!私のコラムのフルテキストインデックスを設定してクエリを試した後、私の結果は90%良くなりましたので、どうもありがとうございます!私が見つけたが解決できなかった唯一の問題は数字の包含です... インスタンスの場合、このクエリを実行すると: 'SELECT id、GameTitle、MATCH(GameTitle)AGAINST( 'super mario bros。3' )マッチ(GameTitle)AGAINST( 'スーパーマリオブラザーズ3'); ' 結果は次のとおりです:スーパーマリオブラザーズ2 _then_スーパーマリオブラザーズ3 これは本当に大変混乱する可能性があるので、これについて何かできることはありますか? – flexage

+1

クエリから数値を削除し、最後に 'AND GameTitle LIKE"%3% "'を最後に追加することはうまくいくようですハックのビット。私はphpの数値を分割し、where節に追加する必要はありませんが、これを行うにはまだ良い方法がない場合は、クエリを生成するときに? – flexage

関連する問題