我正在使用 rails 和搜索我正在使用 Tire 和 elasticsearch。我有一个字符串类型字段,在某些记录中具有值,在某些记录中为零。
我想排序并显示最后,所有在该字段中具有空值的记录。正如我在当前版本的本期https://github.com/elasticsearch/elasticsearch/issues/896中看到的,这无法通过排序和弹性搜索实现。
有没有使用rails的解决方法?我正在尝试使用两个搜索并使用如下示例的过滤器来做到这一点:
filter :not, :missing => { :field => :video_url } if params[:video].present?
filter :missing, { :field => :video_url } if params[:video].blank?
但是它没有用(直到现在我才明白为什么,我会继续调试)。
另一个想法是创建两个具有特定字段的方法。还有其他解决方案/想法吗?
2013 年 2 月 2 日更新
我终于做到了,如下所示:
if video == "yes"
filter :not, :missing => { :field => :video_url }
elsif video == "no"
filter :missing, { :field => :video_url }
end
我自己传递视频参数。我正在对搜索进行排序和提升,但另外我希望所有没有 video_url 字段的对象都出现在底部,无论它们有多相关。事实上,我不需要按这个字段排序,只是为了显示最后的 nil 值字段。
所以为了解决这个问题,我调用了两次搜索并添加了上面的代码,它就像一个魅力。
为了完整起见,我的搜索方法如下:
def self.search(params, video = nil)
tire.search do
query do
boolean do
must { string params[:query], default_operator: "AND" } if params[:query].present?
must { term :active, true }
end
end
sort { by :update_ad => "desc" } unless params[:query].present?
facet "categories" do
terms :category_id
end
if video == "yes"
filter :not, :missing => { :field => :video_url }
elsif video == "no"
filter :missing, { :field => :video_url }
end
end
结尾
如果您不传递视频参数,它将不会应用任何过滤器。在我的映射中,我设置了 boost、analyzer 等。
谢谢