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