【问题标题】:Search result ordering by precedence in rails在 Rails 中按优先级排序的搜索结果
【发布时间】:2014-07-04 11:31:17
【问题描述】:

我正在搜索产品的标题和描述。它很酷,但我只需要搜索即可获得基于结果的优先级。就像标题匹配的结果产品一样,然后是描述。 这是我的控制器代码:

def products
    scope = Product.joins(:vendor).enabled.includes(:vendor, :images)

    # Make sure to select only available vendors
    scope = scope.where("vendors.enabled = ?", true)

    # Filter by vendor
    if params[:vendor_id].present?
      scope = scope.where(vendor_id: params[:vendor_id])
    end

    if params[:search].present?
      scope = scope.filter(params[:search])
    end
    scope
  end

这里是模型。产品.rb

def self.filter(search)
    where("title ILIKE '%#{search}%' OR description ILIKE '%#{search}%'")
  end

【问题讨论】:

    标签: postgresql sorting search ruby-on-rails-4


    【解决方案1】:

    因此,结果将是您拥有一组与其中一个字段中的搜索匹配的 Product 对象。

    缺少的部分是现在您需要对结果进行排序 - 您可以将其作为查询的一部分进行,但这是一项相对较难的工作,我倾向于在 Ruby 中完成这项工作。

    我会首先根据搜索结果中搜索词的出现次数生成结果分数,如下所示:

    def score_result( result, search_term )
       score = result.title =~ search_term ? 5 : 0
       score+= result.text =~ search_term ? 1: 0
    end
    

    然后您可以将其用作搜索的过滤器:

    if params[:search].present?
      searchPattern = Regexp.new(params[:search])
      scope = scope.filter(params[:search]).sort_by { | res | score_result(res, searchPattern) }
    end
    

    这应该对术语首先出现在两者中的结果进行排序,然后是仅出现在标题中的结果,然后是仅出现在文本中的结果。

    几个注意事项:

    1. 这是一个非常幼稚的解释 - 如果您的搜索词是 top hats and tails 会发生什么 - 您只想匹配那个确切的短语吗?您是否应该将其拆分然后为每个单词分配一个分数?如果这样做,是否要返回标题或文本包含 and 的结果作为搜索结果?你如何衡量它们?如果一个词匹配多次,其得分应该与不同词匹配一次一样高吗?
    2. 这是一个相当普遍的问题,在 Ruby 世界中,这意味着可能有人已经解决了它,实际上可能有很多人已经解决了它。总是值得四处寻找,看看是否有任何方便的 gem 可以放入你的包中,让你可以使用其他人的代码来解决你的问题——在这种情况下,像 SearchLogic 这样的东西看起来好像有帮助。

    【讨论】:

    • 这真是太棒了,你让我以不同的方式思考,我接受了你的回答,但我想通过返回整数的 PostgreSQL 定位查询来解决这个问题,我想计算标题搜索结果,然后订购......你有这方面的经验吗?顺便说一句,非常感谢您的出色方法。
    • 您可以在 Postgres 中的 SQL 中执行相同的逻辑,以类似的方式生成分数。您还可以寻找它提供的全文搜索选项(我没有在 PgSQL 中使用过这么多),这可以为您完成大部分工作。在朝那个方向走得太远之前,请考虑一下数据库与应用程序管理的困难——如果写在应用程序层会更容易编写和部署,并且不会将业务逻辑放入数据库中。所以是的,你可以做到,而且数据库可能可以帮助你,但它可能不是最好的选择。
    • 嘿@glenatron,你对查询中的查询有什么看法?
    • 它将一些工作转移到 SQL 中,这具有混合的好处(除非你真的确定你肯定会遇到 SQL 之外的性能问题,那么你可能不想这样做由于我上面评论中的原因,数据库中的内容太多了——这几乎总是过早的优化),但老实说,如果我要在数据库中丢弃那么多代码,不妨使用存储过程或类似的东西。如果可以的话,最好在业务层中使用逻辑而不是在数据层中使用。
    猜你喜欢
    • 2011-10-09
    • 2013-11-28
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    相关资源
    最近更新 更多