2014-05-22 144 views
18

我想更新現有的索引文檔。 我有索引標籤,標題和所有者字段。現在,當用戶更改標題時,我需要查找並更新索引內的文檔。如何使用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客戶端執行此操作的正確方法?

回答

15

我已經使用類似下面的方法成功更新了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) 
    ); 

您可以在NEST Update Unit Tests from the GitHub Source中找到更多發送更新方法的示例。

+0

updateDoc.Title = 「我的新稱號」;是不正確的,它給語法錯誤。我會嘗試幾種不同的方式 – kheya

+0

動態MyDynamic = new System.Dynamic.ExpandoObject();我是如何做到的 – kheya

+0

如何獲得'doc.Id'?我必須先查詢文件嗎? – JedatKinports

3

對於鳥巢2來更新POCO已經有一個ID字段:

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

實際上是鳥巢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)) 
相關問題