2013-04-12 30 views
5

Ví dụ cho upsert là:Elasticsearch Cập nhật API nếu một lĩnh vực không tồn tại

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ 
    "script" : "ctx._source.counter += count", 
    "params" : { 
     "count" : 4 
    }, 
    "upsert" : { 
     "counter" : 1 
    } 
}' 

mà hoạt động nếu tài liệu không tồn tại trước đó.

Giả sử tôi muốn cập nhật một trường không nhất thiết tồn tại, nhưng tài liệu tồn tại. Ví dụ: tài liệu có thể chưa có trường truy cập.

Tôi làm cách nào để thực hiện điều đó?

Trả lời

9

Bạn có thể sử dụng kịch bản cập nhật để kiểm tra nếu trường tồn tại:

curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ 
    "script" : "if(ctx._source.containsKey(\"counter\")){ ctx._source.counter += count; } else { ctx._source.counter = 1; }", 
    "params" : { 
     "count" : 4 
    }, 
    "upsert" : { 
     "counter" : 1 
    } 
}' 
+0

Tuyệt vời! Bạn có biết rằng nếu có một số trang web thực sự giải thích ngôn ngữ MVEL? Tôi đã cố gắng hết sức để tìm hiểu nó, nhưng không thể tìm thấy bất kỳ tài nguyên phong nha nào. http://mvel.codehaus.org/Language+Guide+for+2.0 là khủng khiếp và bao gồm bên cạnh không có gì – eran

+1

Đó là tài nguyên tốt nhất mà tôi biết. Lời khuyên của tôi là cài đặt [javascript plugin] (https://github.com/elasticsearch/elasticsearch-lang-javascript) và chuyển sang javascript làm ngôn ngữ kịch bản của bạn. – imotov

+0

Từ tài liệu elasticsearch về ngôn ngữ kịch bản: 'Mô-đun tập lệnh sử dụng theo mặc định groovy (trước đây được mô tả trong 1.3.x và cũ hơn)' –

0

Các hình thức đơn giản nhất của yêu cầu cập nhật chấp nhận một tài liệu một phần như các doc tham số, mà chỉ được sáp nhập với hiện tại tài liệu. Đối tượng được hợp nhất với nhau, các trường vô hướng hiện có sẽ bị ghi đè, và các trường mới sẽ được thêm vào. Xem Partial Updates to Documents

Ví dụ,

(1) Tạo một tài liệu mới, chỉ với một lĩnh vực field1

curl -XPOST localhost:9200/myidx/mytp/myid?pretty -d '{ 
    "field1" : 1 
}' 

Tài liệu của bạn là,

"_source" : { 
    "field1" : 1 
} 

(2) Cập nhật một phần không phải lĩnh vực -existing, field2

curl -XPOST localhost:9200/myidx/mytp/myid/_update?pretty -d '{ 
    "doc" : { 
     "field2" : 2 
    } 
}' 

Tài liệu của bạn là,

"_source" : { 
    "field1" : 1, 
    "field2" : 2 
} 

(3) Tất nhiên, bạn có thể cập nhật hiện có và không tồn tại lĩnh vực simutaneously

curl -XPOST localhost:9200/myidx/mytp/myid/_update?pretty -d '{ 
    "doc" : { 
     "field2" : 200, 
     "field3" : 3 
    } 
}' 

của bạn tài liệu là,

"_source" : { 
    "field1" : 1, 
    "field2" : 200, 
    "field3" : 3 
} 
Các vấn đề liên quan