加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – pg_search:“多可搜索”结果的排序

发布时间:2020-12-17 03:18:22 所属栏目:百科 来源:网络整理
导读:我正在使用Rails 4.2.4和pg_search 1.0.5. class Advert ActiveRecord::Base include PgSearch multisearchable :against = [:title,:body]end 我想通过我的广告记录的:created_at日期来订购pg_search结果.从逻辑上讲,在我看来,以下可能会起作用(:asc): @
我正在使用Rails 4.2.4和pg_search 1.0.5.

class Advert < ActiveRecord::Base

  include PgSearch
  multisearchable :against => [:title,:body]

end

我想通过我的广告记录的:created_at日期来订购pg_search结果.从逻辑上讲,在我看来,以下可能会起作用(:asc):

> @pgs = PgSearch.multisearch('55948189').order(created_at: :asc)

PgSearch::Document Load (136.1ms)  SELECT "pg_search_documents".* FROM "pg_search_documents" INNER JOIN (SELECT "pg_search_documents"."id" AS pg_search_id,(ts_rank((to_tsvector('simple',coalesce("pg_search_documents"."content"::text,''))),(to_tsquery('simple',''' ' || '55948189' || ' ''')),0)) AS rank FROM "pg_search_documents" WHERE (((to_tsvector('simple',''))) @@ (to_tsquery('simple',''' ' || '55948189' || ' '''))))) AS pg_search_ce9b9dd18c5c0023f2116f ON "pg_search_documents"."id" = pg_search_ce9b9dd18c5c0023f2116f.pg_search_id  ORDER BY pg_search_ce9b9dd18c5c0023f2116f.rank DESC,"pg_search_documents"."id" ASC,"pg_search_documents"."created_at" ASC
=> #<ActiveRecord::Relation [

#<PgSearch::Document id: 3148,content: "Aleksandra | Tallinn | 55948189 Simpatichnaja i se...",searchable_id: 3148,searchable_type: "Advert",created_at: "2015-10-01 11:44:06",updated_at: "2015-10-01 11:44:30">,#<PgSearch::Document id: 3275,searchable_id: 3275,created_at: "2015-10-02 11:05:49",updated_at: "2015-10-02 11:28:48">]>

但是相反的顺序(:desc)会产生相同的结果:

> @pgs = PgSearch.multisearch('55948189').order(created_at: :desc)

PgSearch::Document Load (108.4ms)  SELECT "pg_search_documents".* FROM "pg_search_documents" INNER JOIN (SELECT "pg_search_documents"."id" AS pg_search_id,"pg_search_documents"."created_at" DESC
=> #<ActiveRecord::Relation [

#<PgSearch::Document id: 3148,updated_at: "2015-10-02 11:28:48">]>

有人可以通过:created_at日期解释我如何订购我的搜索结果吗?

更新1:结果的顺序是否可能由pg_search修复,并且没有任何方法可以通过’created_at`进行排序?

我现在正在更仔细地阅读文档,并发现这句话:“默认情况下,pg_search根据可搜索文本和查询之间的tsearch相似性对结果进行排名.要使用不同的排名算法,您可以将:ranking_by选项传递给pg_search_scope “. (见https://github.com/Casecommons/pg_search)

解决方法

有一个简单的答案,但它不适用于“多可搜索”.

首先,我需要从“multisarchable”(适用于多个模型)更改为“pg_search_scope”(仅在单个模型中搜索).

其次,我需要使用:order_within_rank.由于结果是搜索词的100%匹配,因此根据pg_search,它们具有相同的排名. :order_within_rank将次要排名作为决胜局.

class Advert < ActiveRecord::Base

  include PgSearch
  pg_search_scope :search_by_full_advert,:against => [:title,:body],:order_within_rank => "adverts.created_at DESC"

end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读