5

私はelasticsearchでインデックス付けされたいくつかのモデルを持っており、そのうちの1つにはフィルタリングが必要な関連付けがありますが、このようなものをsearchメソッドに追加すると

  search.filter :range, 'sessions.starts_on' => {:gte => start_date,
                                                 :lte => ends_on}

そのような関連付けがないため、すべてのモデルが除外されsessionsます。

では、1つのモデルだけにフィルターを適用する方法はありますか?

どんな考えでも大歓迎です!

4

1 に答える 1

1

そのモデルに特に関連するタイヤインデックスのモジュールを作成し、モデルに含めます。セッションはモデルとの関連付けのみであるため、その参照はelasticsearchに送信されるドキュメントにあります。ドキュメントのjsonをタイヤインデックスモジュールのelasticsearchに渡したため、このようにモデルドキュメントのセッションドキュメントをマージする必要があります

def to_model_json
    self.document.merge({"sessions" => sessions.as_json}).to_json
end

このメソッドは、jsonのドキュメントをタイヤを介してelasticsearchに渡し、セッションがドキュメントにマージされます。

タイヤインデックスモジュールで、フィルタークエリを実行するためにタイヤ検索オブジェクトに渡すことができるインデックス名を指定します

次に、タイヤ検索オブジェクトを作成します

search_object = Tire::Search::Search::new(Model.index_name, other attributes)

https://github.com/karmi/tireから渡すことができる他の属性を確認できます

次に、このように検索メソッドを実行すると、目的の結果が得られます

 search_object.filter :range, 'sessions.starts_on' => {:gte => start_date,
                                                  :lte => ends_on}
于 2012-05-11T08:26:48.813 に答える