2015-10-30 16 views
6

Sto tentando di eseguire l'aggiornamento a ES 2.0. Ho scaricato ES 2.0 e l'ho installato sulla mia macchina Windows.Elasticsearch 2.0: come eliminare per query in Java

Nel mio pom.xml, ho il seguente:

<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> 

Nel mio codice Java, ho fatto cancellare dalla query nel seguente modo quando si utilizza 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(); 

Spero di sostituire questo:

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

con ES 2.0 modo. Cercata su Google ma non è riuscito a trovare un esempio per questo. La documentazione dell'API online mi sembra troppo astratta. Come posso farlo?

Un'altra domanda: devo installare il plug-in delete-by-query nel server Elasticsearch?

Grazie per qualsiasi puntatore!

UPDATE

ho seguito il suggerimento di Max, e qui è quello che ho adesso:

In primo luogo, quando si crea il cliente, effettuare le impostazioni hanno il seguente aspetto:

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

Seconda , nel posto in cui viene eseguita la cancellazione per query:

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

ho installato anche cancellare dal plugin di ricerca eseguendo il seguente nella directory principale di ES:

bin\plugin install delete-by-query 

ottengo errori se non installare questo plugin.

Dopo tutti questi passaggi, le parti correlate a ES funzionano perfettamente.

risposta

10

io credo che si possa usare questo:

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

si deve aggiungere il tipo plugin per le impostazioni:

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

Se si dispone di server remoto è necessario installare il plugin.

+0

Ciao Max, grazie per avermi aiutato! Cosa intendi con "utilizzando il nodo locale"? Ho tutto sul mio taccuino. L'app Web Java viene eseguita sulla porta 8080 e ES viene eseguita sulla porta 9300. Devo avviare manualmente i due uno per uno. Un'altra cosa: la tua impostazione delle impostazioni è errata. Ho aggiornato il mio codice e ho sempre ricevuto l'errore del puntatore nullo. – curious1

+0

Salve, con il nodo locale intendevo utilizzare il nodo ES incorporato (https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/node-client.html). Quando lo usi, non devi avviare un altro client elasticsearch. Penso che ti stia connettendo al tuo nodo elasticsearch usando il client di trasporto (https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/transport-client.html). Dove si ottiene esattamente il puntatore nullo? – Max

+0

Ok, vedo che anche se non si utilizza il nodo incorporato, è necessario inserire plugin.types. Sto modificando il mio commento per questo. – Max

12

plugin.types sono stati deprecati in ES 2.1.0 (source). Quindi la soluzione accettata risulterà in un NullPointerException.

La soluzione è quella di utilizzare il metodo addPlugin:

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

Ümit, grazie per le tue informazioni! – curious1

+0

Qual è lo scopo di "aggiungere il plugin" anche dal lato client? –

2

innanzitutto: aggiungere elasticsearch-2.3.3/plugins/delete-by-query/delete-by-query-2.3.3.jar a costruire il percorso.

poi:

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

Da elastico 5 in poi ...

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, grazie per le informazioni. Buono a sapersi per l'aggiornamento. Saluti. – curious1

Problemi correlati