2011-07-04 16 views
1

私はTire gem(ElasticSearch用)と一緒にRailsを使用しています。複数のモデルを検索する必要があります。何かのように:多くの種類のElasticSearch検索

# title is a field in all models 
Tire.search :tasks, :projects, :posts, { :title => "word" } 

(Luceneの)ドキュメント指向され、私は私がモデルを一つずつ検索し、これらの結果を処理することができます知っているが、それはElasticSearchを考慮に、不要なはずです。

どのような考えですか?

ありがとう、

+0

こんにちは、ユースケースは何ですか? ActiveModelインテグレーションは、確実に1つのモデルごとに検索方法を公開します。しかし、あなたの例のように 'Tire.search'メソッドを使うと、実際に複数のインデックスを検索することができます。つまり、レコードは、あなたのモデルクラスではなく、 'Tire :: Results :: Item'クラスにラップされます。しかし、これは私がとにかく重くなっている動作です。結果をこのフリーフォームクラスでラップしてから、「実際のモデル」をロードする方法を提供します。 https://github.com/karmi/tire/issues/11およびhttps://github.com/karmi/tire/issues/12の問題を参照してください。 – karmi

+1

@karmi、私は 'Tire.search {...}'を試みましたが、少なくとも現在バージョン0.1.13でサポートしていませんでした。私はできるだけ早く私の宝石のバージョンを更新します。とにかく、同じインデックスで検索しているときに、必要に応じて 'type'を使ってフィルタリングすることは、私たちの場合にはうまくいきます。お返事をありがとうございます。 –

答えて

1

1つの可能性は、それらを別個のモデルとして見ることではありません。複合モデルは、すべての文書が、多値化することができる文字列定数によって識別される1つまたは複数の異なるサブモデルに属するアイテムであり得ることであり得る。

これらのサブモデルのいずれかから結果のみを取得する場合は、このサブモデルに属するドキュメントのセットを識別する固定部分をクエリに追加できます。

唯一の洞察は、一意のプライマリキーを持つ必要があることです(暗黙のドキュメントキーのようなものを使用できるため、それほど悪くはありません)。

+1

標準化されていない名前のフィールドがいくつかあるとしても、良いアプローチと思われます。ありがとう。 –