在模型中使用自定义搜索方法时,如何以最佳方式对结果进行分页。我还将结果的排序推送到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)
同样使用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
如何通过有限的网络电话实现这一目标?
答案 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的调用可以很好地显示搜索结果页面,而无需进行任何额外的网络调用。
实体的实际详细视图可以获取所需的全部内容,但这只是每个实体,这对我们有用。