PHP / MySQL后端。我有一个充满电影YouTube风格的数据库。每个视频都有一个名称和类别。视频和类别具有m:n关系。
我希望我的访问者能够搜索视频并让他们在一个搜索字段中输入搜索字词。我无法弄清楚如何根据类别,名称中的出现次数返回最佳搜索结果。
最好的方法是什么?评分? =>检查每个搜索词是否出现在视频名称中;如果是这样,请将视频授予一个点;检查视频是否属于搜索查询中也包含的类别;如果是这样,请给予奖励。按收到的数字点排序?就CPU使用率而言,这听起来非常昂贵。
答案 0 :(得分:2)
使用全文搜索可能会有所帮助:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html#function_match
您可以针对表达式一次测试多个列。
答案 1 :(得分:1)
我不认为您可以避免每次搜索都查看每部电影的标题和类别。所以CPU的使用量是给定的。如果您担心排序的CPU使用率,在大多数情况下它可以忽略不计,因为您只会对超过零点的项进行排序。
话虽如此,您可能想要的是一个部分基于规则且部分基于点的系统。例如,如果您的标题与搜索字词相同,则无论哪个点,它都应该首先出现。构建您的搜索,以便您可以轻松地添加规则并根据需要调整点以获得最佳结果。
编辑:如果标题匹配完全匹配,您可以利用数据库索引而不搜索整个表格。可选地,类别也适用。
答案 2 :(得分:1)
首先,使用全文搜索。它既可以是MySql全文搜索,也可以是某种类型的全文搜索引擎。我推荐sphinx。它非常快速,简单,甚至可以使用SphinxSE与MuSQL集成(因此搜索索引看起来像MySQL中的loke表)。但是,您必须安装和配置它。
其次,考虑按搜索类型拆分搜索结果。任何类型的全文搜索都将返回按相关性排序的匹配项目列表。您可以按所有字段搜索并获得单个列表。这是个坏主意,因为按名称命中和按类别命中将会混合。要解决此问题,您可以进行多次搜索 - 首先按名称搜索,然后按类别搜索。
因此,您将拥有两个匹配的集合,并且您有很多选项如何显示它。一些想法:
您可以将此方法用于任何类型的字段 - 名称,类别,演员,导演等。但是,您使用的字段越多,您必须执行的搜索查询越多