【问题标题】:Weighing search results称重搜索结果
【发布时间】:2011-04-04 23:21:16
【问题描述】:

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

我希望我的访问者能够搜索视频并让他们在一个搜索字段中输入搜索词。我不知道如何根据类别、名称中的出现来返回最佳搜索结果。

处理此类事情的最佳方法是什么?得分? => 检查每个搜索词是否出现在视频名称中;如果是,给视频打分;检查视频是否属于搜索查询中也包含的类别;如果是这样,给它一分。按收到的分数排序?就 CPU 使用而言,这听起来非常昂贵。

【问题讨论】:

    标签: php mysql algorithm search


    【解决方案1】:

    使用全文搜索可能会有所帮助:http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html#function_match

    您可以针对一个表达式一次测试多个列。

    【讨论】:

      【解决方案2】:

      我认为您无法避免在每次搜索时查看每部电影的标题和类别。因此,CPU 使用率是给定的。如果您担心排序的 CPU 使用率,在大多数情况下可以忽略不计,因为您只会对得分大于零的项目进行排序。

      话虽如此,您可能想要的是一个部分基于规则和部分基于点的系统。例如,如果您的标题与搜索词相同,则无论分数如何,它都应该排在第一位。设计您的搜索,以便您可以轻松添加您认为合适的规则和调整点以产生最佳结果。

      编辑:如果标题完全匹配,您可以利用数据库索引而不是搜索整个表。 (可选)类别也是如此。

      【讨论】:

        【解决方案3】:

        首先,使用全文搜索。它可以是 MySql 全文搜索,也可以是某种外部全文搜索引擎。我推荐sphinx。它非常快速、简单,甚至可以使用 SphinxSE 与 MuSQL 集成(因此搜索索引在 MySQL 中看起来像 loke 表)。但是,您必须安装和配置它。

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

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

        1. 根据搜索引擎返回的相关率合并2个集合。这看起来像是单个查询的结果,但您知道每个项目是什么(名称命中或类别命中),因此您可以突出显示它
        2. 执行与上述相同的处理,但为不同的集合分配不同的权重,例如相关性 = 0.7*name_relevancy+0.3*category_relevancy。这将使搜索结果更自然
        3. 将结果吐出到选项卡/组中,例如'有 N 个标题和 M 个类别匹配您的查询)
        4. 显示结果时使用波段。对于每个页面(假设您使用分页器拆分搜索结果)显示第一组中的 N 个项目和第二组中的 M 个项目(您可以一个接一个地显示集合或随机播放项目)。如果其中一个集合中没有足够的项目,那么就从另一个集合中获取更多项目,因此每页总是有 M+N 个项目
        5. 你能想象到的任何其他方式

        您可以将此方法用于任何类型的字段 - 姓名、类别、演员、导演等。但是,您使用的字段越多,您必须执行的搜索查询就越多

        【讨论】:

        • 太棒了,正是我想要的。感谢并欢迎 SO
        猜你喜欢
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-01
        • 2011-08-27
        • 2020-12-26
        • 1970-01-01
        • 1970-01-01
        • 2016-06-11
        相关资源
        最近更新 更多