[英]pg_search: ordering of "multisearchable" results
我將 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', coalesce("pg_search_documents"."content"::text, ''))) @@ (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, content: "Aleksandra | Tallinn | 55948189 Simpatichnaja i se...", searchable_id: 3275, searchable_type: "Advert", 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, (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', coalesce("pg_search_documents"."content"::text, ''))) @@ (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" DESC
=> #<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, content: "Aleksandra | Tallinn | 55948189 Simpatichnaja i se...", searchable_id: 3275, searchable_type: "Advert", created_at: "2015-10-02 11:05:49", updated_at: "2015-10-02 11:28:48">]>
有人可以解釋我如何按:created_at
日期對搜索結果進行排序嗎?
更新 1 :結果的順序是否可能由pg_search
固定並且沒有任何方法可以通過“created_at”進行排序?
我現在正在更仔細地閱讀文檔並發現以下語句:“默認情況下,pg_search 根據可搜索文本和查詢之間的 :tsearch 相似度對結果進行排名。要使用不同的排名算法,您可以將 :ranked_by 選項傳遞給 pg_search_scope . ”(見https://github.com/Casecommons/pg_search )
有一個簡單的答案,但它不適用於“multisearchable”。
首先,我需要從“multisearchable”(適用於多個模型)更改為“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
我參加聚會可能會遲到 5 年,但只是偶然發現了同樣的問題,並想出了如何做到這一點。
簡短的簡單答案 - 將您的查詢,即PgSearch.multisearch('55948189')
轉換為數組。
我的例子: @results = PgSearch.multisearch(params[:main_search][:query])
雖然你不能對@results
分組或排序,但你可以用@results.to_a
。
就我而言,我有兩個模型 - Products
和Manufacturers
(制造商生產產品),我想首先在搜索結果中顯示所有產品結果,然后再顯示所有制造商結果。
首先,定義一個數組作為排序依據:
sorting_order = ["Manufacturer", "Product"]
然后
@results.to_a.sort_by { |x| sorting_order.index x.searchable_type }
(注: serachable_type
是gem遷移生成的PgSearch::Document
的默認列)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.