如何编写mysql查询来搜索数据库?

时间:2011-03-18 12:41:29

标签: mysql search

我拥有一个壁纸网站,我正在尝试编写一个搜索功能,搜索数据库以查找用户搜索的字词。我在数据库中有两个字段,我正在搜索TAGS和NAME

我正在做的当前方式是我将搜索词分成多个单词,然后使用这些词搜索数据库。因此,如果用户搜索“纽约”,我的查询将如下所示

SELECT * FROM wallpapers 
WHERE tags LIKE '%New%' OR name LIKE '%new%' 
or tags LIKE '%York%' OR name LIKE '%York%'

当然问题是,任何带有新词的内容都会被拉起来,就像说“新车”等。如果我用以下代码替换上面的查询,那么它太模糊,只有2壁纸将出现

SELECT * FROM wallpapers 
WHERE tags LIKE '%New York%' OR name LIKE '%New York%'

有没有人有更好的方法来编写搜索查询?

4 个答案:

答案 0 :(得分:4)

看起来你想引入相关性的概念。

尝试:

select * from (
SELECT 1 as relevance, * FROM wallpapers 
WHERE tags LIKE '%New York%' OR name LIKE '%New York%'
union
select 10 as relevance, * FROM wallpapers 
WHERE (tags LIKE '%New%' OR name LIKE '%new%') 
and (tags LIKE '%York%' OR name LIKE '%York%')
union
select 100 as relevance, * FROM wallpapers 
WHERE tags LIKE '%New%' OR name LIKE '%new%' 
union
select 100 as relevance, * FROM wallpapers 
WHERE tags LIKE '%York%' OR name LIKE '%York%'
)
order by relevance asc

顺便说一句,如果你的数据库变得太大,这将表现得非常非常糟糕 - 你想要一致地格式化你的列,所以它们都是大写(或者全部小写),你想要避免使用通配符如果可能的话,你的where子句。

一旦出现问题,请查看全文搜索。

答案 1 :(得分:1)

您可以使用第一个查询进行第一次选择,然后您可以对结果进行排名:包含关键字“新”和“约克”的壁纸的排名将高于仅包含其中一个关键字的壁纸。< / p>

如果第二个查询只返回2个壁纸,你能不能提出一些未通过查询返回的壁纸的标签/名称的例子,但是你想拥有它?

这是大写字母的问题吗?空间?

答案 2 :(得分:1)

我相信您可能会受益于全文索引。阅读mysql全文搜索。您需要为表使用MyISAM引擎。

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

答案 3 :(得分:0)

也许这是一个非常愚蠢的问题,但可能会追随你想要的东西?

SELECT * FROM wallpapers 
WHERE ( tags LIKE '%New%' OR name LIKE '%new%' )
and ( tags LIKE '%York%' OR name LIKE '%York%' )

这会搜索必须同时包含两个单词的壁纸。

警告在搜索new'yorknew%york等“字词”时,请注意这种方式注入SQL。也许最简单的方法是在拆分时将所有非alpha /非数字字符视为空格,以使new@york和类似字符变为newyork

关于搜索的注意事项:

在数据库中以这种方式搜索是一种过度杀伤(全表扫描)。只要你只有几个壁纸,这不是一个更大的问题。只要数据库适合内存,几乎所有当前便宜的硬件都应该能够在一秒钟内搜索一百万个壁纸。

然而,对于标记和名称信息超出可用内存的较大网站,您肯定会遇到问题。然后是时候尝试其他方式进行搜索了。但是,要做多少取决于预期的使用模式,所以要回答需要更多信息。