gpt4 book ai didi

postgresql - 在 rails 中按优先级排序的搜索结果

转载 作者:行者123 更新时间:2023-11-29 13:30:36 25 4
gpt4 key购买 nike

我正在搜索产品的标题和描述。它工作起来很酷,但我只需要一个搜索来获得基于结果的优先级。就像标题匹配的结果产品首先出现,然后是描述。这是我的 Controller 代码:

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

最佳答案

因此,结果将是您拥有一组 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 会发生什么 - 您只想匹配那个确切的词组吗?你应该把它分开然后给每个词打分吗?如果这样做,是否希望返回标题或文本包含 的结果作为搜索结果?你如何称量它们?如果一个词匹配多次,那么它的得分是否应该与不同词各匹配一次的得分一样高?
  2. 这是一个相当普遍的问题,在 Ruby 世界中,这意味着可能已经有人解决了,事实上可能有很多人已经解决了它。总是值得四处搜索,看看是否有任何方便的 gem 可以放入您的包中,让您可以使用其他人的代码来解决您的问题 - 在本例中是 SearchLogic。看起来它可以提供帮助。

关于postgresql - 在 rails 中按优先级排序的搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24573331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com