0

私はsymfony2のFOSElasticaBundleでelasticsearchを使用しており、検索後にオブジェクトを取得するための標準的な方法は何なのか疑問に思っていました。

doctrine オブジェクトのすべてのフィールドをマップしたとします。そのため、それらはすべてelasticsearch に保存され、さらに重要なことに返されます。さて、検索してElastica\ResultSet. FOSElasticaBundle のデフォルトのファインダーは のデータを無視しResultSet、SQL データベースにクエリを実行して Doctrine オブジェクトを取得します (テンプレートに渡されて描画されます)。

  1. 少し無駄に思えるので、これが一般的に行われているかどうか(異なるデータストアへの2つのクエリ)を疑問に思っていました。または、人々は から手動で Doctrine オブジェクトを作成しますかResultSet?

  2. オブジェクトを手動で作成すると、elasticsearch のデータが古くなっている可能性があります。現在、これは表示の問題ではありませんが、古いデータから doctrine オブジェクトを作成すると、この古いデータが永続化される可能性はありません (コードの一部がフラッシュされた場合; symfony 1.4 と doctrine 1.2 でこの問題が発生しました)。

ありがとう!


アップデート

もう少し読んだ後、2 つのアイデアがあります (簡単だが無駄な追加の SQL クエリ メソッドを除く)。

  1. カスタム ElasticaToModelTransformer を作成し、エンティティを doctrines エンティティ マネージャーから切り離して、エンティティが誤って永続化されないようにします。教義のドキュメントからもう少し読むと、実際にこれを行う必要はないようです。シリアル化されていないオブジェクトはエンティティ マネージャーに関連付けられていますか?

  2. オブジェクトを表す正規化された php 配列を作成し、doctrine オブジェクトではなく、この配列からすべてのテンプレートを削除します。symfonyシリアライザー コンポーネントのドキュメントで説明されているように、これはエンティティのインスタンスとしてのオブジェクトと、何らかの形式 (JSON、xml) にシリアル化されたオブジェクトとの間の状態であるため、この配列は Elasticsearch の結果またはdoctrine オブジェクトとテンプレートは気にする必要はありません。

    このアプローチは、必要に応じてテンプレートから関連オブジェクトを取得するメソッドを呼び出すことができないことを意味します。配列内の情報に制限されます。

4

2 に答える 2

0

誰かが答えを探しているなら、役に立つかもしれない sth があります: FOSElasticaBundle と Doctrine Hydration

于 2015-02-04T09:00:58.283 に答える
0

あなたは実際に質問でそれを正しく理解しました。

ORM を使用する場合、ElasticSearch から古いオブジェクトを作成して永続化すると、Doctrine は古い値をプライマリ データ ストアに保存します。そして、それは悪いです。

長所と短所を含む2つのソリューションを次に示します。

  1. ES に (「フィールド」を介して) ドキュメント ID のみを返すように依頼し、Doctrine からそれらを取得することは、それに対処するための優れた方法です: オーバーヘッドは低く、利点または実際の Doctrine オブジェクト (編集可能、稼働中) があります。現在まで、他のユーザーと同じテンプレートを共有しています...)。それが ElasticaBundle の機能です。検索に必要なフィールドにのみインデックスを付ける必要があります (小さいインデックス)。

  2. ES ドキュメントを直接使用するのは、よりトリッキーです。すべてのフィールドをマップする必要はありません (ソースを取得します。これは、インデックス化ドキュメントに手を加えていません)。しかし、ビューを適応させる必要があり、カスタム ゲッターを呼び出すことはできません。ドキュメントに対してビジネス ロジックを実行することはできません。また、検索するフィールドだけでなく、表示するすべてのフィールドにインデックスを付ける必要があります(より大きなインデックス)。

于 2013-08-22T15:59:22.503 に答える