我正在使用rails和搜索我正在使用Tire和elasticsearch。我有一个字符串类型字段,在某些记录中有值,在某些记录中为零。
我想排序并显示最后一个,此字段中包含空值的所有记录。正如我在当前版本中的此问题https://github.com/elasticsearch/elasticsearch/issues/896中看到的那样,通过sort和elasticsearch无法实现这一点。
是否有使用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
端
如果您未传递视频参数,则不会应用任何过滤器。在我的映射中,我设置了增强器,分析器等。
谢谢
答案 0 :(得分:1)
首先,您链接的Elasticsearch issue仍处于打开状态,只是一项功能建议。
其次,就像一张纸条一样,你真的确定要排序而不是提高某些记录的得分吗?
第三,如果你确实做想要对这个字段进行排序,最简单的方法就是用一些最后一个值("ZZZ"
,奇怪的Unicode字符,你为该字段编制索引得到图片)。您可能不希望默认执行此操作,因此最好使用multi_field
功能。当然,您必须重新索引语料库以获取新设置。
最后,可以按脚本排序(请参阅documentation),但它会产生通常明显的性能影响。