2015-10-30 15 views
6

Tôi đang cố nâng cấp lên ES 2.0. Tôi đã downloaed ES 2.0 và cài đặt nó trên máy tính Windows của tôi.Elasticsearch 2.0: cách xóa bằng truy vấn trong Java

Trong pom.xml của tôi, tôi đã điều sau đây:

<dependency> 
    <groupId>org.elasticsearch</groupId> 
    <artifactId>elasticsearch</artifactId> 
    <version>2.0.0-rc1</version> 
</dependency> 

<dependency> 
    <groupId>org.elasticsearch.plugin</groupId> 
    <artifactId>delete-by-query</artifactId> 
    <version>2.0.0-rc1</version> 
</dependency> 

Trong mã Java của tôi, tôi đã xóa bằng cách truy vấn theo cách sau khi sử dụng ES 1.7.3:

StringBuilder b = new StringBuilder(""); 
    b.append("{"); 
    b.append(" \"query\": {"); 
    b.append("  \"term\": {"); 
    b.append("   \"category\": " + category_value); 
    b.append("  }"); 
    b.append(" }"); 
    b.append("}"); 

    client = getClient(); 

    DeleteByQueryResponse response = client.prepareDeleteByQuery("myindex") 
       .setTypes("mydocytype") 
       .setSource(b.toString()) 
       .execute() 
       .actionGet(); 

Tôi hy vọng sẽ thay thế điều này:

DeleteByQueryResponse response = client.prepareDeleteByQuery("myindex") 
       .setTypes("mydocytype") 
       .setSource(b.toString()) 
       .execute() 
       .actionGet(); 

bằng cách ES 2.0. Googled nhưng không tìm thấy một ví dụ cho nó. Tài liệu API trực tuyến dường như quá trừu tượng đối với tôi. Tôi làm nó như thế nào?

Một câu hỏi khác: Tôi có phải cài đặt plugin xóa theo truy vấn trong máy chủ Elasticsearch không?

Cảm ơn mọi con trỏ!

CẬP NHẬT

Tôi đi theo gợi ý của Max, và đây là những gì tôi có bây giờ:

Đầu tiên, khi tạo ra các khách hàng, thực hiện cài đặt trông giống như sau:

Settings settings = Settings.settingsBuilder() 
         .put("cluster.name", "mycluster") 
         .put("plugin.types", DeleteByQueryPlugin.class.getName()) 
         .build(); 

Second , tại địa điểm thực hiện xóa theo truy vấn:

DeleteByQueryResponse rsp = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE) 
    .setIndices("myindex") 
    .setTypes("mydoctype") 
    .setSource(b.toString()) 
    .execute() 
    .actionGet(); 

Tôi cũng cài đặt xóa bằng cách cắm truy vấn bằng cách chạy sau trong thư mục gốc của ES:

bin\plugin install delete-by-query 

tôi nhận được lỗi nếu tôi không cài đặt plugin này.

Sau tất cả các bước này, các bộ phận liên quan đến ES hoạt động tốt.

Trả lời

10

Tôi tin rằng bạn có thể sử dụng này:

 DeleteByQueryResponse rsp = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE) 
      .setTypes("mydocytype") 
      .setSource(b.toString()) 
      .execute() 
      .actionGet(); 

Bạn phải thêm loại plugin để thiết lập của bạn:

 Settings settings = Settings.settingsBuilder() 
         .put("plugin.types", DeleteByQueryPlugin.class.getName()) 

Nếu bạn có máy chủ từ xa mà bạn phải cài đặt plugin.

+0

Xin chào Max, cảm ơn vì đã giúp tôi ra! Bạn có ý nghĩa gì bởi "sử dụng nút cục bộ"? Tôi có mọi thứ trên sổ ghi chép của mình. Ứng dụng web Java chạy trên cổng 8080 và ES chạy trên cổng 9300. Tôi phải tự khởi động từng cái một. Một điều khác: Báo cáo cài đặt của bạn bị lỗi. Tôi cập nhật mã của tôi, và luôn luôn có lỗi con trỏ null. – curious1

+0

Xin chào, với nút cục bộ, tôi muốn sử dụng nút ES được nhúng (https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/node-client.html). Khi bạn sử dụng điều này, bạn không phải bắt đầu một ứng dụng khách elasticsearch khác. Tôi nghĩ bạn đang kết nối với nút elasticsearch của mình bằng cách sử dụng ứng dụng khách (https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html). Trường hợp nào bạn nhận được con trỏ null? – Max

+0

Ok tôi thấy rằng ngay cả khi bạn không sử dụng nút nhúng, bạn phải đặt plugin.types. Tôi đang chỉnh sửa bình luận của tôi cho việc này. – Max

12

plugin.types đã không được chấp nhận trong ES 2.1.0 (source). Vì vậy, giải pháp được chấp nhận sẽ dẫn đến một NullPointerException.

Các giải pháp là sử dụng phương pháp addPlugin:

Client client = TransportClient.builder().settings(settings()) 
       .addPlugin(DeleteByQueryPlugin.class) 
       .build() 
       .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host",9300)); 
+0

Ümit, cảm ơn thông tin của bạn! – curious1

+0

Mục đích của việc "thêm plugin" vào phía máy khách là gì? –

2

trước hết: thêm elasticsearch-2.3.3/plugins/xóa theo truy vấn/xóa-by-query-2.3.3.jar để xây dựng đường dẫn.

thì:

Client client = TransportClient.builder().settings(settings) 
       .addPlugin(DeleteByQueryPlugin.class) 
       .build() 
       .addTransportAddress(new InetSocketTransportAddress(
         InetAddress.getByName("192.168.0.224"), 9300)); 
4

Từ đàn hồi 5 trở đi ...

final BulkIndexByScrollResponse response = DeleteByQueryAction.INSTANCE.newRequestBuilder(super.transportClient) 
        .filter(
          QueryBuilders.boolQuery() 
            .must(QueryBuilders.termQuery("_type", "MY_TYPE")) // Trick to define and ensure the type. 
            .must(QueryBuilders.termQuery("...", "..."))) 
        .source("MY_INDEX") 
        .get(); 

    return response.getDeleted() > 0; 

Oficial documentation

+0

Dani, cảm ơn thông tin. Điều cần biết để nâng cấp. Chúc mừng. – curious1

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