2012-04-17 41 views
7

Hãy nói rằng tôi có một loại tag trong một chỉ số ElasticSearch, với các bản đồ sau:Làm cách nào để cập nhật nhiều mục trong ElasticSearch?

{ 
    "tag": { 
     "properties": { 
      "tag": {"type": "string", "store": "yes"}, 
      "aliases": {"type": "string"} 
     } 
    } 
} 

Mỗi mục là một thẻ, và một loạt các bí danh đến thẻ đó. Dưới đây là một mục ví dụ:

{ 
    "word": "weak", 
    "aliases": ["anemic", "anaemic", "faint", "flimsy"] 
} 

Thỉnh thoảng, tôi muốn thêm từ khóa mới bằng bí danh của họ và thêm bí danh mới vào từ khóa hiện tại.

Việc thêm từ khóa mới bằng bí danh của họ thật dễ dàng, nó chỉ là một Tài liệu mới. Tuy nhiên, làm cách nào tôi có thể thêm bí danh mới vào các từ khóa hiện tại theo cách lành mạnh?

Tôi biết tôi chỉ có thể tìm kiếm từ khóa, nhận tài liệu, tìm kiếm xem bí danh đã tồn tại trong mảng bí danh chưa, nếu không thêm nó, thay vì lưu. Tuy nhiên - điều này không có vẻ giống như một giải pháp tốt.

Có cách nào để thực hiện cập nhật hàng loạt không?

Trả lời

7

Bộ lưu trữ elasticsearch cơ bản, Lucene, không có hoạt động cập nhật. Vì vậy, tất cả các bản cập nhật được thực hiện bằng cách tìm bản ghi, xóa phiên bản cũ và thêm phiên bản mới. Trong elasticsearch, bạn có thể tiết kiệm một chút khi di chuyển các bản ghi tới tận máy khách bằng cách sử dụng Update API. Nó vẫn sẽ yêu cầu tìm kiếm hồ sơ mặc dù. Những gì bạn, có thể, muốn là Update by query nhưng, thật không may, nó chưa được triển khai.

+1

Cập nhật theo truy vấn vẫn chưa được thêm vào Elastic, nhưng [plugin] (https://github.com/yakaz/elasticsearch-action-updatebyquery/) tồn tại. –

+1

Kể từ Elasticsearch 2.3, cập nhật theo truy vấn có sẵn - https://www.elastic.co/guide/en/elasticsearch/reference/2.3/docs-update-by-query.html – PhaedrusTheGreek

2

Tìm kiếm đàn hồi có Update API. Với API đó, bạn có thể thực hiện các thao tác sau:

curl -XPOST 'localhost:9200/test/tag/weak/_update' -d '{ 
    "script" : "ctx._source.aliases += faint" 
}' 
+0

Xin chào Eric, Điều này là dành cho cập nhật tài liệu đơn phải không? –

+0

Bạn có thể cho tôi biết làm thế nào tôi có thể thực hiện cập nhật một bản ghi trong php? –

0

Ngoài ra nếu bạn thêm cùng một giá trị với cùng id, nó sẽ tự động cập nhật dữ liệu cũ hơn.

6

Hãy thử này sử dụng _bulk:

http://127.0.0.1:9200/myindex/type/_bulk 
{ 
"update": { 
    "_index": "myindex", 
    "_type": "type", 
    "_id": "myid" 
} 
}{ 
"doc": { 
    "field": "new value" 
} 
}{ 
"update": { 
    "_index": "myindex", 
    "_type": "type", 
    "_id": "id" 
} 
}{ 
"doc": { 
    "field": "new value" 
} 
} 
0

API rời Elasticsearch có thể được sử dụng cho các yêu cầu cập nhật là tốt, ít nhất là cho các khách hàng Java.

List list = new Arraylist(); 
list.add("hello"); 
BulkProcessor bulk = new BulkProcessor(); 
UpdateRequest update = new UpdateRequest("index", "type", "id1"); 
update.script("ctx._source.aliases+= newaliases"); //dynamic script 
update.addScriptParam("newaliases", list); 
bulk.add(update); 

Lưu ý rằng tập lệnh động bị tắt trong phiên bản mới hơn của elasticsearch. Cho phép điều đó hoặc sử dụng các tập lệnh được biên dịch trước để sử dụng tính năng này.

0

Bạn có thể thực hiện tương tự bằng cách sử dụng trình khách Java mùa xuân bằng cách sử dụng mã sau đây. Sau đây là các phụ thuộc được sử dụng trong mã.

import org.elasticsearch.action.update.UpdateRequest; 

import org.elasticsearch.index.query.QueryBuilder; 

import org.springframework.data.elasticsearch.core.query.UpdateQuery; 

import org.springframework.data.elasticsearch.core.query.UpdateQueryBuilder; 

private UpdateQuery updateExistingDocument(String Id) { 
    // Add updatedDateTime, CreatedDateTime, CreateBy, UpdatedBy field in existing documents in Elastic Search Engine 
    UpdateRequest updateRequest = new UpdateRequest().doc("UpdatedDateTime", new Date(), "CreatedDateTime", new Date(), "CreatedBy", "admin", "UpdatedBy", "admin"); 

    // Create updateQuery 
    UpdateQuery updateQuery = new UpdateQueryBuilder().withId(Id).withClass(ElasticSearchDocument.class).build(); 
    updateQuery.setUpdateRequest(updateRequest); 

    // Execute update 
    elasticsearchTemplate.update(updateQuery); 
} 
2

Điều này phù hợp với tôi.

input_list.dat:

{ "index" : { "_index": "my_index", "_type": "my_type", "_id": "existing-value" } } 

{ "Field_to_update": "New_Value" } 

{ "index" : { "_index": "my_index", "_type": "my_type", "_id": "existing_value" } } 

{ "Field_to_update": "New_Value" } 

Command:

curl -k -XPOST 'https://my_host:9200/my_url/_bulk' --data-binary "@input_list.dat"; echo 
+0

Cảm ơn, hãy làm việc cho tôi! Sử dụng Tìm kiếm Đàn hồi 5.4 –

1

Elasticsearch 2.3.0 giới thiệu Update By Query API như một phần của dài chờ đợi Reindex API.

Như một ví dụ, đây là cách bạn có thể cập nhật tất cả các tài liệu để xóa một lĩnh vực nào đó nếu nó tồn tại:

POST /myindex/mytype/_update_by_query 
{ 
    "script": { 
    "inline": "ctx._source.remove(\"remove\")" 
    }, 
    "query": { 
    "exists": { 
     "field": "remove" 
    } 
    } 
} 

Ví dụ trên sử dụng kịch bản nội tuyến, vì vậy hãy chắc chắn để kích hoạt nó trong elasticsearch.yml với script.inline: on.

Các vấn đề liên quan