1

各ゲーム名の 30,000 要素のデータベースがあります。

私は現在使用しています:

SELECT * from gamelist WHERE name LIKE '%%%$search%%%' OR aliases LIKE '%$search%' LIMIT 10"

検索バー用。
ただし、次のようなことについては非常にうるさい場合があります。

'Animal Crossing: Wild World' 

多くのユーザーは「:」がそのフレーズに含まれていることを知らないため、検索を開始すると、次のようになります。

 Animal Crossing Wild World 

表示されません。

どうすればSQLをより寛容にすることができますか?

4

4 に答える 4

3

検索パラメーターの英数字以外の文字をワイルドカードに置き換えて、それAnimal Crossing Wild World%Animal%Crossing%Wild%World%フィルタリングします。

于 2012-07-10T07:13:26.510 に答える
2

次のようなキーワークを含む別のテーブルウィッチを作成することをお勧めします

+---------+------------+
| game_id | keyword_id |
+---------+------------+
|       1 |          1 |
|       1 |          2 |
|       1 |          3 |
|       1 |          4 |
+---------+------------+

 

+------------+--------------+
| keyword_id | keyword_name |
+------------+--------------+
|          1 | animal       |
|          2 | crossing     |
|          3 | wild         |
|          4 | world        |
+------------+--------------+

その後、ユーザーが指定したテキストを簡単にキーワードに分解してデータベースで検索できます。魔女は、ユーザーが探していた可能性のあるゲームの ID を提供します。

ああ、「:」や「-」などの特殊記号を削除すると、同じフレーズに複数のキーワードが必要なくなります。

于 2012-07-10T07:05:48.763 に答える
1

MySQL エンジンが MyISAM または InnoDB の場合は、Match () AGAINST () を試すことができます。

http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

http://dev.mysql.com/doc/refman/5.6/en/fulltext-boolean.html

結果の SQL は次のようになります。

SELECT * from gamelist WHERE MATCH (name, aliases) AGAINST ('$search' IN BOOLEAN MODE) LIMIT 10

検索の動作は、検索エンジンで使用されるブール検索に似ています。

于 2012-07-10T07:17:28.297 に答える
1

以下は、MySQL LIKE %string% からのもので、十分に寛容ではありません。他に使用できるものはありますか?ユーザー M_M:

MyISAM を使用している場合は、全文索引を使用できます。このチュートリアルを参照してください

別のストレージ エンジンを使用している場合は、mysql のストレージ エンジンまたはクエリ可能な別のサーバーとして機能する sphinx などのサード パーティの全文エンジンを使用できます。

MySQL のフルテキスト インデックスを使用すると、検索A J Kellyが一致しますAJ Kelly(問題を混乱させることはありませんが、A、J、および AJ はデフォルトでは短すぎるため無視され、Kelly では一致します)。 LIKE '%string%') は、関連性でランク付けできる部分一致を許可するためです。

また、 SOUNDEXを使用して、単語の発音上の等価物にインデックスを作成し、検索用語に SOUNDEX を適用してからそれらを使用してインデックスを検索することにより、検索をより寛容にすることもできます。たとえば、 soundex marymarie、およびmarryはすべて一致します。

于 2012-07-10T07:03:28.683 に答える