Elasticsearch:轮胎 - 如果缺少字段,请将其放在最后

时间:2013-02-01 22:14:23

标签: ruby-on-rails ruby elasticsearch tire

我正在使用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

如果您未传递视频参数,则不会应用任何过滤器。在我的映射中,我设置了增强器,分析器等。

谢谢

1 个答案:

答案 0 :(得分:1)

首先,您链接的Elasticsearch issue仍处于打开状态,只是一项功能建议。

其次,就像一张纸条一样,你真的确定要排序而不是提高某些记录的得分吗?

第三,如果你确实想要对这个字段进行排序,最简单的方法就是用一些最后一个值("ZZZ",奇怪的Unicode字符,你为该字段编制索引得到图片)。您可能不希望默认执行此操作,因此最好使用multi_field功能。当然,您必须重新索引语料库以获取新设置。

最后,可以按脚本排序(请参阅documentation),但它会产生通常明显的性能影响。