[英]tire elasticsearch kaminari pagination with overriden search in active record model
在模型中使用自定義搜索方法時,如何最佳地分頁結果。 我還把結果的順序推到了Elasticsearch上,從db中獲取結果之后,結果再次根據elasticsearch的順序進行了排序。
我的模型搜索方法如下:
def self.search query
model_objs = Model.tire.search do
query do
boolean do
should { string "field:#{query}", boost: 10}
should { string "#{query}"}
//other boolean queries
end
end
sort do
by "fieldname"
end
end
ids = model_objs.results.map {|x| x.id.to_i}
model_objs = Model.find(ids)
ids.collect {|id| model_objs.detect {|x| x.id == id}}
end
在我的控制器中,我只是采取行動來獲得結果。
def search
search_term = params[:search_term].strip
@model_objs = Model.search search_term
end
我在這里有兩個目標,首先,我想優化去Elasticsearch或數據庫的調用數量。 我想對結果進行分頁。
tire
中提到的默認分頁不起作用,因為我已覆蓋search
方法。
@articles = Article.search params[:q], :page => (params[:page] || 1)
同樣,使用使用from
和size
從彈性搜索中獲取分頁結果的方法,也意味着我會一遍又一遍地調用elasticsearch來獲取結果,所以我不想做這樣的事情。
def self.search query, page_num
model_objs = Model.tire.search do
query do
boolean do
should { string "field:#{query}", boost: 10}
should { string "#{query}"}
//other boolean queries
end
end
sort do
by "fieldname"
end
size 10
from (page_num - 1) * 10
end
ids = model_objs.results.map {|x| x.id.to_i}
model_objs = Model.find(ids)
ids.collect {|id| model_objs.detect {|x| x.id == id}}
end
如何通過有限的網絡通話實現這一目標?
您可以將頁面參數傳遞給彈性搜索
model_objs = Model.tire.search({page: page_num}) do
query do
boolean do
should { string "field:#{query}", boost: 10}
should { string "#{query}"}
//other boolean queries
end
end
無需通過添加“來自”。
免責聲明:我與OP合作,這只是發布我們采用的解決方案。
可以從Elastic Search索引中保留顯示搜索結果所需的所有字段,而不是從ES中獲取部分屬性並從數據庫中獲取其余屬性。
這樣,對Elasticsearch的查詢調用可以很好地顯示搜索結果頁面,而無需進行任何額外的網絡調用。
實體的實際詳細視圖可以獲取所需的全部內容,但這僅針對每個實體,這對我們有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.