簡體   English   中英

Elasticsearch:Tire-如果缺少字段,請放在最后

[英]Elasticsearch:Tire - If field is missing, put it last

我正在使用滑軌,而在搜索中,我正在使用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?

但這沒有用(我不明白為什么直到現在,我將繼續調試)。

另一個想法是使用特定字段創建兩個方法。 還有其他解決方案/想法嗎?

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,分析器等。

謝謝

首先,您鏈接到的Elasticsearch 問題仍然存在,僅是功能建議。

第二,作為注釋,您真的確定要排序而不是提高某些記錄的分數嗎?

第三,如果你真的想要排序在這個領域,最簡單的方法是只與排在最后(一些價值指數領域的"ZZZ" ,怪異的Unicode字符,你得到的圖片)。 您可能不想默認情況下執行此操作,因此使用multi_field功能是個好主意。 當然,您必須重新索引語料庫才能使用新設置。

最后,可以按腳本進行排序(請參閱文檔 ),但它通常會對性能產生明顯影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM