轮胎弹性搜索kaminari分页与活动记录模型中的覆盖搜索

时间:2013-12-06 06:14:43

标签: ruby-on-rails pagination elasticsearch tire kaminari

在模型中使用自定义搜索方法时,如何以最佳方式对结果进行分页。我还将结果的排序推送到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

我这里有两个目标,首先我想优化去弹性搜索或我的数据库的调用次数。我想对结果进行分页。

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

如何通过有限的网络电话实现这一目标?

2 个答案:

答案 0 :(得分:0)

您可以将页面参数传递给弹性搜索

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

无需通过添加'来自'。

答案 1 :(得分:0)

免责声明:我使用OP,这只是发布我们采用的解决方案。

可以使弹性搜索索引保存显示搜索结果所需的所有字段,而不是从ES中获取部分属性并从数据库中获取其余部分。

这样,查询对elasticsearch的调用可以很好地显示搜索结果页面,而无需进行任何额外的网络调用。

实体的实际详细视图可以获取所需的全部内容,但这只是每个实体,这对我们有用。