私はsymfony2のFOSElasticaBundleでelasticsearchを使用しており、検索後にオブジェクトを取得するための標準的な方法は何なのか疑問に思っていました。
doctrine オブジェクトのすべてのフィールドをマップしたとします。そのため、それらはすべてelasticsearch に保存され、さらに重要なことに返されます。さて、検索してElastica\ResultSet
. FOSElasticaBundle のデフォルトのファインダーは のデータを無視しResultSet
、SQL データベースにクエリを実行して Doctrine オブジェクトを取得します (テンプレートに渡されて描画されます)。
少し無駄に思えるので、これが一般的に行われているかどうか(異なるデータストアへの2つのクエリ)を疑問に思っていました。または、人々は から手動で Doctrine オブジェクトを作成しますか
ResultSet
?オブジェクトを手動で作成すると、elasticsearch のデータが古くなっている可能性があります。現在、これは表示の問題ではありませんが、古いデータから doctrine オブジェクトを作成すると、この古いデータが永続化される可能性はありません (コードの一部がフラッシュされた場合; symfony 1.4 と doctrine 1.2 でこの問題が発生しました)。
ありがとう!
アップデート
もう少し読んだ後、2 つのアイデアがあります (簡単だが無駄な追加の SQL クエリ メソッドを除く)。
カスタム ElasticaToModelTransformer を作成し、エンティティを doctrines エンティティ マネージャーから切り離して、エンティティが誤って永続化されないようにします。教義のドキュメントからもう少し読むと、実際にこれを行う必要はないようです。シリアル化されていないオブジェクトはエンティティ マネージャーに関連付けられていますか?
オブジェクトを表す正規化された php 配列を作成し、doctrine オブジェクトではなく、この配列からすべてのテンプレートを削除します。symfonyシリアライザー コンポーネントのドキュメントで説明されているように、これはエンティティのインスタンスとしてのオブジェクトと、何らかの形式 (JSON、xml) にシリアル化されたオブジェクトとの間の状態であるため、この配列は Elasticsearch の結果またはdoctrine オブジェクトとテンプレートは気にする必要はありません。
このアプローチは、必要に応じてテンプレートから関連オブジェクトを取得するメソッドを呼び出すことができないことを意味します。配列内の情報に制限されます。