web-dev-qa-db-ja.com

NESTを使用してElasticSearchインデックス内の既存のドキュメントを更新するにはどうすればよいですか?

既存のインデックス付きドキュメントを更新しようとしています。タグ、タイトル、所有者のフィールドにインデックスを付けました。ここで、ユーザーがタイトルを変更したときに、インデックス内のドキュメントを見つけて更新する必要があります。

ドキュメント全体またはタイトルフィールドのみを更新して置き換えますか?

public void UpdateDoc(ElasticsearchDocument doc)
{
 Uri localhost = new Uri("http://localhost:9200");
 var setting = new ConnectionSettings(localhost);
 setting.SetDefaultIndex("movies");
 var client = new ElasticClient(setting);

 IUpdateResponse resp = client.Update<ElasticsearchDocument, IndexedDocument>(
                                  d => d.Index("movies")
                                        .Type(doc.Type)
                                        .Id(doc.Id), doc);
}

機能しません。上記のコードは構文エラーを生成します。 ElasticSearchのC#NESTクライアントを使用してこれを行う正しい方法を知っている人はいますか?

23
kheya

次のような方法を使用して、NESTでElasticsearchインデックスの既存のアイテムを正常に更新しました。この例では、更新するフィールドを含む部分的なドキュメントのみを送信する必要があることに注意してください。

    // Create partial document with a dynamic
    dynamic updateDoc = new System.Dynamic.ExpandoObject();
    updateDoc.Title = "My new title";

    var response = client.Update<ElasticsearchDocument, object>(u => u
        .Index("movies")
        .Id(doc.Id)
        .Document(updateDoc)
     );

GitHubソースからのNEST更新ユニットテスト で更新を送信する方法の例を見つけることができます。

19
Paige Cook

実際、Nest 2の場合:

dynamic updateFields = new ExpandoObject();
updateFields.IsActive = false;
updateFields.DateUpdated = DateTime.UtcNow;

await _client.UpdateAsync<ElasticSearchDoc, dynamic>(new DocumentPath<ElasticSearchDoc>(id), u => u.Index(indexName).Doc(updateFields))
13
Jonathon Cwik

Nest 2が既にIDフィールドを含むPOCOを更新する場合:

 var task = client.UpdateAsync<ElasticsearchDocument>(
                    new DocumentPath<ElasticsearchDocument>(doc), u => 
                        u.Index(indexName).Doc(doc));
4
gerosalesc

Nest 7.xの優れたソリューション:

 await _client.UpdateAsync<ElasticSearchDoc>(doc.Id, u => u.Index("movies").Doc(new ElasticSearchDoc { Title = "Updated title!" }));
2
Ali Bayat