ELASTICSEARCH 6. UPDATE API (PHẦN 2)

Phần này chúng ta sẽ tiếp tục tìm hiểu về Update API với chức năng cập nhật bằng document (Update with a partial document) và một số chức năng đặc biệt khác.

Các ví dụ sẽ dựa theo index và type của phần trước.

CẬP NHẬT BẰNG DOCUMENT - UPDATE WITH A PARTIAL DOCUMENT

Update API hỗ trợ truyền vào một document để "trộn" (merge) với document đã tồn tại, thay đổi hoặc thêm mới trường. Ví dụ nếu trường name đã có, nó sẽ được cập nhật giá trị thành new_name, nếu chưa thì document sẽ có thêm trường name:

POST test/_doc/1/_update { "doc" : { "name" : "new_name" } }

Nếu trong request body có cả document và script thì script sẽ được ưu tiên thực hiện, document sẽ bị bỏ qua.

XÁC ĐỊNH "NOOP" UPDATE

Nếu document được khai báo trong body thì giá trị của nó được trộn với phần _source đã tồn tại. Mặc định rằng ES sẽ không cập nhật bất cứ thứ gì nếu nó không tìm thấy giá trị nào mới và sẽ trả về result là noop như sau:

{ "_shards": { "total": 0, "successful": 0, "failed": 0 }, "_index": "test", "_type": "_doc", "_id": "1", "_version": 7, "result": "noop" }

Tức là nếu name từ trước đã có giá trị là "new_name" thì khi gửi request với "name": "new_name" thì mặc nhiên toàn bộ yêu cầu cập nhật sẽ bị bỏ qua và trả về response như trên. Ta có thể tắt chức năng trên bằng cách thêm tham số detect_noop vào request như sau:

POST test/_doc/1/_update { "doc" : { "name" : "new_name" }, "detect_noop": false }

UPSERT (UPDATE + INSERT)

Nếu document chưa có trên ES, phần nội dung bên trong tham số upsert sẽ được thêm như một document mơi, ngược lại nếu đã tồn tại thì phần script sẽ được thực thi:

POST test/_doc/1/_update { "script" : { "source": "ctx._source.counter += params.count", "lang": "painless", "params" : { "count" : 4 } }, "upsert" : { "counter" : 1 } }
scripted_upsert: nếu ta muốn thực thi phần lệnh script bất kể document có tồn tại trong ES hay không thì ta có thể khởi tạo document mới bên trong phần script thay vì upsert, và đặt tham số scripted_upsert là true:

POST sessions/session/dh3sgudg8gsrgl/_update { "scripted_upsert":true, "script" : { "id": "my_web_session_summariser", "params" : { "pageViewEvent" : { "url":"foo.com/bar", "response":404, "time":"2014-01-01 12:32" } } }, "upsert" : {} }
doc_as_upsert: thay vì gửi lên một document độc lập cộng với một document bên trong upsert, ta có thể đặt tham số doc_as_upsert bằng true để có thể dùng document độc lập thay cho document bên trong upsert:

POST test/_doc/1/_update { "doc" : { "name" : "new_name" }, "doc_as_upsert" : true }

Từ khóa: elasticsearch, vtcc_intern_9, Công nghệ thông tin