gpt4 book ai didi

ruby-on-rails - 如何通过最接近查询的匹配来排序结果?

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:58 27 4
gpt4 key购买 nike

我有一个正在使用 Jquery TokenInput 的字段自动完成产品。查找我正在做的产品:

def token
@products = Product.order(:name)
respond_to do |format|
format.html
format.json { render json: @products.where("name ILIKE ?", "%#{params[:q]}%").limit(10).order('name DESC') }
end
end

如果我有一个名为 Rice 的产品并在该字段中进行搜索,输入“r”、“ri”和“ric”,我希望最接近的结果是匹配查询。相反,如果我在数据库中有超过 10 种不同类型的大米,结果将是“乱序”的,Rice 在 10 种创建的大米中被放置在第 6 或第 9 位左右。对我来说,米饭应该排在第一位,而不是饭团或蛋糕,但我得到的却是:

Brown Rice # First result in Tokeninput
Rice Cake
Yellow Rice
Long Grain Rice
Rice Ball
Chinese Rice
Super Rice
Rice
New Rice
The Super Rice Game

即使我准确地输入“Rice”,我也会得到与上面类似的结果。如果输入 r、ri、ric 或 rice,我希望它成为第一选择,但我的结果不相信顺序,他们只想要困惑。这将如何完成?

最佳答案

您可以将以下方法添加到您的 Product 模型中:

def self.good_search(criteria)
regexp = /#{criteria}/i; # case-insensitive regexp based on your string

result = order(:name).where("name ILIKE ?", "%#{criteria}%").limit(10)
result.sort{|x, y| (x =~ regexp) <=> (y =~ regexp) }
end

我在这里使用匹配运算符 ( =~ ),它返回正则表达式匹配的位置。 “米饭”遇到得越早,就越接近结果数组字符串的顶部。这种方法可能不适用于大数组,但对于 10 个元素来说没问题。

这是你的 Controller :

def token
respond_to do |format|
format.html
format.json { render json: Product.good_search(params[:q]) }
end
end

祝你好运!

关于ruby-on-rails - 如何通过最接近查询的匹配来排序结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22435780/

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