我有一个30k元素的数据库,每个游戏名称。
我目前正在使用:
SELECT * from gamelist WHERE name LIKE '%%%$search%%%' OR aliases LIKE '%$search%' LIMIT 10"
搜索栏。
但是,它可能会对以下内容非常挑剔:
'Animal Crossing: Wild World'
请注意,许多用户不会知道':'在该短语中,所以当他们开始搜索时:
Animal Crossing Wild World
它不会出现。
我怎样才能让sql更宽容?
答案 0 :(得分:3)
将搜索参数中的非字母数字字符替换为通配符,以便Animal Crossing Wild World
变为%Animal%Crossing%Wild%World%
并对其进行过滤。
答案 1 :(得分: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。
哦,并删除特殊符号,例如“:”或“ - ”,因此您不需要为同一个词组使用多个关键字。
答案 2 :(得分:1)
以下内容来自用户M_M的MySQL LIKE %string% not quite forgiving enough. Anything else I can use?:
如果您使用的是MyISAM,则可以使用全文索引。 See this tutorial
如果您使用的是其他存储引擎,则可以使用第三方全文引擎,例如sphinx,它可以充当storage engine for mysql或可以查询的单独服务器。
使用MySQL全文索引,
A J Kelly
上的搜索将匹配AJ Kelly
(不会混淆事项,但A,J和AJ会被忽略,因为它们在默认情况下太短而且会在Kelly上匹配。)通常全文更宽容(通常比LIKE'%string%'快),因为允许部分匹配,然后可以根据相关性进行排名。您还可以使用SOUNDEX通过索引单词的语音等效词来搜索更加宽容,并通过在搜索字词上应用SOUNDEX然后使用它们搜索索引来搜索它们。例如,使用soundex
mary
,marie
和marry
都会匹配。
答案 3 :(得分: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
搜索的行为更像是搜索引擎中使用的布尔搜索。