我自己有一个墙纸网站,我正在尝试写一个搜索功能,将搜索数据库中的术语用户正在搜索。我在数据库中有两个字段,我正在搜索标签和名称
我目前使用的方法是获取搜索词,将其分成多个单词,然后使用这些词搜索数据库。因此,如果用户搜索"New York“,我的查询将如下所示
SELECT * FROM wallpapers
WHERE tags LIKE '%New%' OR name LIKE '%new%'
or tags LIKE '%York%' OR name LIKE '%York%'当然,问题是,任何带有术语new的东西都会被拉出来,比如"new car“等等。如果我用下面的代码替换上面的查询,那么它就太模糊了,只会显示2张墙纸
SELECT * FROM wallpapers
WHERE tags LIKE '%New York%' OR name LIKE '%New York%'有没有人有更好的方法来编写搜索查询?
发布于 2011-03-18 20:50:15
看起来你想引入相关性的概念。
尝试:
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子句中使用通配符。
一旦这成为一个问题,请查看全文搜索。
发布于 2011-03-18 21:02:15
也许这是一个非常愚蠢的问题,但可能是你想要的?
SELECT * FROM wallpapers
WHERE ( tags LIKE '%New%' OR name LIKE '%new%' )
and ( tags LIKE '%York%' OR name LIKE '%York%' )这将搜索必须同时包含两个单词的墙纸,但不能位于任何位置。
警告在搜索像new'york或new%york这样的“单词”时,要小心这种方式的SQL注入。也许最简单的方法是在拆分时将所有非字母/非数字字符视为空格,这样new@york和类似字符就变成了new和york。
关于搜索的说明:
以这种方式在数据库中进行搜索显然是大材小用(全表扫描)。只要你只有几张墙纸,这不是一个大问题。几乎所有当前廉价的硬件都应该能够在一秒钟左右的时间内搜索到一百万张墙纸,只要数据库可以放入内存中。
然而,对于标记和名称信息超过可用RAM的较大站点,您肯定会遇到问题。然后,是时候尝试一些其他的搜索方式了。然而,要做什么在很大程度上取决于预期的使用模式,因此需要更多的信息来回答。
发布于 2011-03-18 20:46:01
你可以使用你的第一个查询来做第一个选择,然后你可以对结果进行排名:带有"New“和"York”两个关键字的墙纸的排名将高于只有一个关键字的墙纸。
如果第二个查询只返回2张墙纸,你能给出一些查询没有返回但你想要的墙纸的标签/名称的例子吗?
是大写字母的问题吗?空格?
https://stackoverflow.com/questions/5352106
复制相似问题