私はレールを使用しており、検索にはタイヤとエラスティックサーチを使用しています。一部のレコードでは値があり、一部のレコードでは nil である文字列型フィールドがあります。
このフィールドに null 値を持つすべてのレコードを最後に並べ替えて表示したいと思います。この問題https://github.com/elasticsearch/elasticsearch/issues/896でわかるように、現在のバージョンでは、これはソートとエラスティックサーチでは不可能です。
レールで回避策はありますか?2 つの検索を使用し、次の例のようなフィルターを使用してそれを実行しようとしています。
filter :not, :missing => { :field => :video_url } if params[:video].present?
filter :missing, { :field => :video_url } if params[:video].blank?
しかし、うまくいきませんでした (なぜ今まで理解できなかったのか、デバッグを続けます)。
もう 1 つのアイデアは、特定のフィールドを持つ 2 つのメソッドを作成することです。他の解決策/アイデアはありますか?
2013 年 2 月 2 日更新
私は最終的に次のようにしました:
if video == "yes"
filter :not, :missing => { :field => :video_url }
elsif video == "no"
filter :missing, { :field => :video_url }
end
そして、私はビデオパラメータを自分で渡しています。私は検索を並べ替えてブーストしていますが、さらに video_url フィールドを持たないすべてのオブジェクトを、関連性に関係なく一番下に表示したいと考えています。実際、最後に nil 値フィールドを表示するためだけに、このフィールドでソートする必要はありません。
これを解決するために、検索を 2 回呼び出しており、上記のコードを追加すると、魅力的に機能します。
完全を期すために、私の検索方法は次のとおりです。
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
終わり
video パラメーターを渡さない場合、フィルターは適用されません。私のマッピングでは、ブースト、アナライザーなどを設定しました。
ありがとうございました