繁体   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