称重搜索结果

时间:2010-08-27 18:50:46

标签: php mysql algorithm search

PHP / MySQL后端。我有一个充满电影YouTube风格的数据库。每个视频都有一个名称和类别。视频和类别具有m:n关系。

我希望我的访问者能够搜索视频并让他们在一个搜索字段中输入搜索字词。我无法弄清楚如何根据类别,名称中的出现次数返回最佳搜索结果。

最好的方法是什么?评分? =>检查每个搜索词是否出现在视频名称中;如果是这样,请将视频授予一个点;检查视频是否属于搜索查询中也包含的类别;如果是这样,请给予奖励。按收到的数字点排序?就CPU使用率而言,这听起来非常昂贵。

3 个答案:

答案 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表)。但是,您必须安装和配置它。

其次,考虑按搜索类型拆分搜索结果。任何类型的全文搜索都将返回按相关性排序的匹配项目列表。您可以按所有字段搜索并获得单个列表。这是个坏主意,因为按名称命中和按类别命中将会混合。要解决此问题,您可以进行多次搜索 - 首先按名称搜索,然后按类别搜索。

因此,您将拥有两个匹配的集合,并且您有很多选项如何显示它。一些想法:

  1. 根据搜索引擎返回的相关率合并2套。这看起来像一个查询的结果,但你知道每个项目是什么(名称命中或类别命中),所以你可以突出显示这个
  2. 执行与上述相同的操作,但为不同的集合分配不同的权重,因为eaxmple relatedancy = 0.7 * name_relevancy + 0.3 * category_relevancy。这将使搜索结果更加自然
  3. 将结果吐入标签/组,例如'有N个标题和M类别与您的查询相匹配)
  4. 显示结果时使用波段。对于每个页面(假设您使用分页器分割搜索结果)从第一组中删除N个项目,从第二个组别中删除M个项目(您可以逐个设置或随机设置项目)。如果其中一个集合中没有足够的项目,那么只需从另一个集合中获取更多项目,因此每页总有M + N个项目
  5. 你能想象的任何其他方式
  6. 您可以将此方法用于任何类型的字段 - 名称,类别,演员,导演等。但是,您使用的字段越多,您必须执行的搜索查询越多