簡體   English   中英

活動記錄模型中具有替代搜索的輪胎elasticsearch kaminari分頁

[英]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)

同樣,使用使用fromsize從彈性搜索中獲取分頁結果的方法,也意味着我會一遍又一遍地調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM