2016-12-31 6 views
0

C#でNESTクライアントを使用し、Elasticsearch v5.xを使用して汎用データローダーを作成しようとしています。私は自分のESインデックス上の型にカスタムクラスマッピングを定義することができ、idとして扱われるべきプロパティを特に記述することもできます。これは正常に動作し、データをロードするためにバルクAPIを使用することができます。NESTのElasticsearchタイプにIdPropertyを動的に割り当てます。

[ElasticsearchType(IdProperty = "col1")] 
    public class Table1 
    {  
    public int col1 { get; set; } 
    public string col2 { get; set; } 
    public string col3 { get; set; } 
    } 

ただし、インデックスに新しいタイプをロードする必要があるたびに、クラスを定義する必要があります。だから私は、XML入力を提供し、クラスオブジェクトを動的に生成し、そのクラスオブジェクトに対して、IdPropertyを設定する必要がある汎用ロードユーティリティを構築したいと考えています。私はまだ飛行中に動的なオブジェクトを構築する方法を理解しようとしており、今週試してみるべきいくつかのサンプルを見つけました。

私はその障害を乗り越えることができると言いましょう。私の次の質問は、実行時にIdPropertyを動的に設定する方法です。他の提案も歓迎されます。

おかげ

答えて

0

System.ComponentModel.TypeDescriptorを使用して、とても長いTypeDescriptorは、これらの属性を取得するために使用されるように、実行時に型にを属性を追加することが可能です。ただしNESTではTypeDescriptorを使用しないため、このルートをとることはできません。デフォルトでは

NEST will look for a property with the case-insensitive name "Id" to use as the id for a documentIdPropertyとはElasticsearchTypeAttributeが存在しないと何も推論されたマッピングがConnectionSettings上に設定されていない場合。だから、あなたのタイプに必ずIdのプロパティがあることを確認することができます。

+0

ご回答ありがとうございます。私は、主な問題に対処するために少し別のルートをとった。私は今私のXMLをJsonに変換しています。私は文書を索引付けするために使用している生のJsonを生成しています。その間に、私はJsonのどのプロパティがIdとして扱われるべきかを識別するための設定を持っており、idを動的に正しく追加しています。 jsonがビルドされたら、低レベルのクライアントの一括メソッドを使用しています。 – askids

+0

また、私は同様の結果、つまりid属性を動的に追加するためにexpandoObjectでdynamicを使ってみました。より小さなデータセットに対しても機能します。しかし、より大きなセットのために、私はStackoverflow例外を取得し始めました(恐らく両方が悪いコーディングと動的オブジェクトの制限のためです)。だから私はそのアプローチを追求しませんでした。 – askids

関連する問題