2016-08-30 9 views
4

バルクメソッド NESTからインデックスの子レコードをElasticsearchに使用して問題が発生しています。Elasticsearch C#NEST IndexMany Children

私は2.4.4

は、私のようなインデックスマッピングされてきたElasticSearch 2.3.5およびNESTを使用しています:

myindex 
    { 
    "mappings": { 
     "elasticparent": {}, 
     "elasticchild": { 
      "_parent": { 
      "type": elasticparent 
      } 
     } 
     } 
    } 

を私はIndexMany方法を使用して親オブジェクトをインデックス化しました:

client.IndexMany<elasticparent>(batch, "myindex"); 

これはすべてうまくいきます。

IndexManyを使用して子どものインデックスを作成したいと思います。これまでに試したことは次のとおりです。

 client.Bulk(s => s.IndexMany(IenumerableOfChild, 
            (bulkDescriptor, record) => 
            bulkDescriptor.Index("myindex").Type("elasticchild").Parent(record.Id))); 

子と親は同じID整数を共有します。

私はエラーは発生しませんが、子どもたちは決してインデックスに登録されず、ドキュメントは総インデックスカウントに追加されません。それらを個別に索引付け

作品:

foreach (var child in IenumerableOfChild 
      { 

       client.Index(child, descriptor => descriptor 
       .Parent(child.Id.ToString()).Index("myindex")); 
      } 

私は個別にインデックスマス量にしたくありません。 IndexManyを使用して、子レコードを一括してインデックスしたいと思います。誰かが間違っていることを指摘できますか?

答えて

3

さらに調査したところ、Elastic Serverはタイムアウトを返していました。一度に1000個のアイテムに要求をバッチ処理することで、正しく機能しています!

foreach (IEnumerable<object> batch in objects.Batch(1000)) 
      { 
       var indexResponse = client.Bulk(s => s.IndexMany(batch, 
             (bulkDescriptor, record) => 
              bulkDescriptor.Index("myindex").Parent(record.Id.ToString()).Document(record).Type("elasticchild").Id(record.Id.ToString()))); 

       Console.WriteLine(indexResponse); 
      } 
+0

嬉しいです。バッチサイズとクラスタで同時に送信できる並行バッチリクエストの数が関係しています。 –

+0

ありがとうございます。私は同時の要求を考えていませんでした。それは本当に良い考えです。おそらくバルク非同期ですか? –

+1

タスクベースの 'BulkAsync'メソッドが既に存在します。そのため、それらのコレクションを使用して並行バルクリクエストを起動できます。これを達成する方法のアイデアについては 'master'の' BulkAll'を見てください - https://github.com/elastic/elasticsearch-net/blob/52541d0a472b6be85f5fe5d966374655671a3d37/src/Nest/Document/Multiple/BulkAll/ElasticClient -BulkAll.cs。それについてのPRもあります。問題の議論があります:https://github.com/elastic/elasticsearch-net/pull/2162 –

関連する問題