1

我有一个包含 30k 个元素的数据库,每个游戏名称。

我目前正在使用:

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 LIKE %string% 不够宽容。还有什么我可以用的吗?由用户 M_M:

如果您使用的是 MyISAM,则可以使用全文索引。看这个教程

如果你使用不同的存储引擎,你可以使用像 sphinx 这样的第三方全文引擎,它可以作为mysql 的存储引擎或可以查询的单独服务器。

使用 MySQL 全文索引,搜索A J Kelly将匹配AJ Kelly(不会混淆问题,但 A、J 和 AJ 将被忽略,因为它们默认太短并且会在 Kelly 上匹配。)通常全文更宽容(通常比LIKE '%string%') 因为允许部分匹配,然后可以根据相关性进行排名。

您还可以使用SOUNDEX通过索引单词的语音等效项来使搜索更加宽容,并通过将 SOUNDEX 应用于您的搜索词然后使用它们来搜索索引来搜索它们。例如,使用 soundex marymariemarry将全部匹配。

于 2012-07-10T07:03:28.683 回答
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 回答