0

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

谢谢

4

1 回答 1

1

首先,您链接到的 Elasticsearch问题仍然是开放的,只是一个功能建议。

其次,就像一个注释,你真的确定要排序而不是提高某些记录的分数吗?

第三,如果您确实对该字段进行排序,最简单的方法是仅使用最后出现的某个值对该字段进行索引("ZZZ"奇怪的 Unicode 字符,您明白了)。默认情况下,您可能不想这样做,因此使用该multi_field功能是个好主意。当然,您必须重新索引您的语料库以获取新设置。

最后,可以按脚本排序(请参阅文档),但它具有通常且明显的性能影响。

于 2013-02-02T08:59:18.890 回答