2014-05-22 16 views
18

Tôi đang cố gắng cập nhật tài liệu được lập chỉ mục hiện có. Tôi đã lập chỉ mục các thẻ, tiêu đề và trường chủ sở hữu. Bây giờ khi người dùng thay đổi tiêu đề, tôi cần tìm và cập nhật tài liệu bên trong chỉ mục.Làm cách nào để cập nhật tài liệu hiện có bên trong chỉ mục ElasticSearch bằng NEST?

Tôi có nên cập nhật và thay thế toàn bộ tài liệu hoặc chỉ trường tiêu đề không?

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); 
} 

Nó không hoạt động. Đoạn mã trên tạo ra lỗi cú pháp. Có ai biết cách chính xác để thực hiện điều này bằng cách sử dụng ứng dụng C# NEST của ElasticSearch không?

Trả lời

15

Tôi đã cập nhật thành công các mục hiện có trong chỉ mục Elasticsearch của mình bằng NEST bằng cách sử dụng phương pháp như sau. Lưu ý trong ví dụ này, bạn chỉ cần gửi một phần tài liệu với các trường mà bạn muốn được cập nhật.

// 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) 
    ); 

Bạn có thể tìm thêm ví dụ về cách gửi nội dung cập nhật trong NEST Update Unit Tests from the GitHub Source.

+0

updateDoc.Title = "title mới của tôi"; không chính xác, nó cho lỗi cú pháp. Tôi sẽ thử vài cách khác nhau – kheya

+0

động MyDynamic = new System.Dynamic.ExpandoObject(); là làm thế nào tôi đã làm nó – kheya

+0

Làm thế nào để bạn có được 'doc.Id'? Tôi có phải truy vấn tài liệu trước không? – JedatKinports

3

Đối Nest 2 để cập nhật một POCO đó đã bao gồm một trường ID:

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

Trên thực tế cho Nest 2 đó là:

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)) 
Các vấn đề liên quan