10

sto cercando di ri-index mio setup di ricerca elastico, attualmente guardando the Elastic search documentation e an example using the Python APIricerca Reindicizzazione elastico tramite API rinfusa, scansione e scorrere

Sono un po 'confuso su come funziona tutto questo però. Sono stato in grado di ottenere l'ID del libro dalla API di Python:

es = Elasticsearch("myhost") 

index = "myindex" 
query = {"query":{"match_all":{}}} 
response = es.search(index= index, doc_type= "my-doc-type", body= query, search_type= "scan", scroll= "10m") 

scroll_id = response["_scroll_id"] 

Ora la mia domanda è, a che serve questo a me? Cosa mi dà anche la conoscenza dell'ID di scorrimento? La documentazione dice di usare la "Bulk API" ma non ho idea di come i fattori scoll_id in questo, è stato un po 'di confusione.

Qualcuno potrebbe dare un breve esempio che mostra come reindicizzare da questo punto, considerando che ho lo scroll_id correttamente?

risposta

7

Salve è possibile utilizzare la scroll scroll per scorrere tutti i documenti nel modo più efficiente. Usando scroll_id puoi trovare una sessione che è memorizzata sul server per la tua specifica richiesta di scorrimento. Quindi è necessario fornire scroll_id con ciascuna richiesta per ottenere più articoli.

Il bulk API è per documenti di indicizzazione più efficienti. Quando copi e indicizzi hai bisogno di entrambi, ma non sono realmente correlati.

Ho un codice java che potrebbe aiutarti a capire meglio come funziona.

public void reIndex() { 
    logger.info("Start creating a new index based on the old index."); 

    SearchResponse searchResponse = client.prepareSearch(MUSIC_INDEX) 
      .setQuery(matchAllQuery()) 
      .setSearchType(SearchType.SCAN) 
      .setScroll(createScrollTimeoutValue()) 
      .setSize(SCROLL_SIZE).execute().actionGet(); 

    BulkProcessor bulkProcessor = BulkProcessor.builder(client, 
      createLoggingBulkProcessorListener()).setBulkActions(BULK_ACTIONS_THRESHOLD) 
      .setConcurrentRequests(BULK_CONCURRENT_REQUESTS) 
      .setFlushInterval(createFlushIntervalTime()) 
      .build(); 

    while (true) { 
     searchResponse = client.prepareSearchScroll(searchResponse.getScrollId()) 
       .setScroll(createScrollTimeoutValue()).execute().actionGet(); 

     if (searchResponse.getHits().getHits().length == 0) { 
      logger.info("Closing the bulk processor"); 
      bulkProcessor.close(); 
      break; //Break condition: No hits are returned 
     } 

     for (SearchHit hit : searchResponse.getHits()) { 
      IndexRequest request = new IndexRequest(MUSIC_INDEX_NEW, hit.type(), hit.id()); 
      request.source(hit.sourceRef()); 
      bulkProcessor.add(request); 
     } 
    } 
} 
5

Per chi si imbatte in questo problema, è possibile utilizzare il seguente API dal client Python per reindicizzare:

https://elasticsearch-py.readthedocs.org/en/master/helpers.html#elasticsearch.helpers.reindex

Questo potrebbe aiutare a evitare di dover scorrere e cercare di ottenere tutti i dati e utilizzare l'API di massa per inserire i dati nel nuovo indice.

+0

È una breve introduzione, ma l'API è davvero utile per me, grazie :) –

+0

Ha funzionato bene, è possibile utilizzarlo in modo differenziale con una ricerca "intervallo" di data per aggiornare lo stesso nuovo indice in modo molto utile. – TheFiddlerWins

6

qui è un esempio di reindicizzazione un altro nodo elasticsearch utilizzando elasticsearch-py:

from elasticsearch import helpers 
es_src = Elasticsearch(["host"]) 
es_des = Elasticsearch(["host"]) 

helpers.reindex(es_src, 'src_index_name', 'des_index_name', target_client=es_des) 

si può anche Reindicizza il risultato di una query per un diverso indice ecco come si fa:

from elasticsearch import helpers 
es_src = Elasticsearch(["host"]) 
es_des = Elasticsearch(["host"]) 

body = {"query": {"term": {"year": "2004"}}} 
helpers.reindex(es_src, 'src_index_name', 'des_index_name', target_client=es_des, query=body) 
Problemi correlati