我拥有一个壁纸网站,我正在尝试编写一个搜索功能,搜索数据库以查找用户搜索的字词。我在数据库中有两个字段,我正在搜索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%'
有没有人有更好的方法来编写搜索查询?
答案 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引擎。
答案 3 :(得分:0)
也许这是一个非常愚蠢的问题,但可能会追随你想要的东西?
SELECT * FROM wallpapers
WHERE ( tags LIKE '%New%' OR name LIKE '%new%' )
and ( tags LIKE '%York%' OR name LIKE '%York%' )
这会搜索必须同时包含两个单词的壁纸。
警告在搜索new'york
或new%york
等“字词”时,请注意这种方式注入SQL。也许最简单的方法是在拆分时将所有非alpha /非数字字符视为空格,以使new@york
和类似字符变为new
和york
。
关于搜索的注意事项:
在数据库中以这种方式搜索是一种过度杀伤(全表扫描)。只要你只有几个壁纸,这不是一个更大的问题。只要数据库适合内存,几乎所有当前便宜的硬件都应该能够在一秒钟内搜索一百万个壁纸。
然而,对于标记和名称信息超出可用内存的较大网站,您肯定会遇到问题。然后是时候尝试其他方式进行搜索了。但是,要做多少取决于预期的使用模式,所以要回答需要更多信息。