gpt4 book ai didi

ruby-on-rails - Elasticsearch:Tire-如果缺少字段,请放在最后

转载 作者:行者123 更新时间:2023-12-03 02:09:59 25 4
gpt4 key购买 nike

我正在使用滑轨,而在搜索中,我正在使用Tire和elasticsearch。我有一个字符串类型字段,在某些记录中有值,在某些记录中为nil。

我想对所有在该字段中具有空值的记录进行排序和显示。正如我在当前版本的https://github.com/elasticsearch/elasticsearch/issues/896中看到的那样,这不可能通过sort和elasticsearch实现。

滑轨是否有解决方法?我正在尝试使用两个搜索并使用类似以下示例的过滤器来做到这一点:

    filter :not, :missing => { :field => :video_url } if params[:video].present?
filter :missing, { :field => :video_url } if params[:video].blank?

但这没有用(我不明白为什么直到现在,我将继续调试)。

另一个想法是使用特定字段创建两个方法。还有其他解决方案/想法吗?

更新2/2/2013

我终于做到了,就像下面这样:
    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,分析器等。

谢谢

最佳答案

首先,您链接到的Elasticsearch issue仍然处于打开状态,仅是功能建议。

第二,作为注释,您真的确定要排序而不是提高某些记录的分数吗?

第三,如果您确实想在此字段上排序,最简单的方法是仅使用最后出现的某个值对字段进行索引("ZZZ",奇怪的Unicode字符,您会得到图片)。您可能不想默认情况下执行此操作,因此使用 multi_field 功能是个好主意。当然,您必须重新索引语料库才能使用新设置。

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

关于ruby-on-rails - Elasticsearch:Tire-如果缺少字段,请放在最后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14655935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com