0

私はレールを使用しており、検索にはタイヤとエラスティックサーチを使用しています。一部のレコードでは値があり、一部のレコードでは 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 パラメーターを渡さない場合、フィルターは適用されません。私のマッピングでは、ブースト、アナライザーなどを設定しました。

ありがとうございました

4

1 に答える 1

1

まず、リンクしている Elasticsearch の問題はまだ未解決であり、機能の提案にすぎません。

次に、メモとして、特定のレコードのスコアを上げるのではなく、並べ替えたいと本当に思っていますか?

第三に、実際にこのフィールドでソートたい場合、最も簡単な方法は、最後にある値でフィールドにインデックスを付けることです ( "ZZZ"、奇妙な Unicode 文字、画像が得られます)。デフォルトではおそらくこれを行いたくないので、このmulti_field機能を使用することをお勧めします。もちろん、新しい設定を取得するには、コーパスのインデックスを再作成する必要があります。

最後に、スクリプトでソートすることは可能ですが (ドキュメントを参照)、通常の明らかなパフォーマンスへの影響があります。

于 2013-02-02T08:59:18.890 に答える