2013-07-09 17 views
26

Ho un'istanza di AWS CloudSearch che sto ancora sviluppando.Come cancellare tutti i dati da AWS CloudSearch?

A volte, ad esempio quando apporto alcune modifiche al formato di un campo, mi ritrovo a voler cancellare tutti i dati e rigenerarlo.

C'è un modo per cancellare tutti i dati utilizzando la console, o devo andare su di esso con mezzi programmatici?

Se devo usare mezzi selezione programmatica (cioè generare e inviare un po 'di "eliminare" i file SDF) non v'è alcun buon modo per eseguire una query per tutti i documenti in un'istanza CloudSearch?

immagino che potuto basta cancellare e ricreare l'istanza, ma thattakes un po ', e perde tutte le opzioni indici/espressioni di rango/testo/etc

+0

creare uno script per creare il dominio di ricerca con tutti i parametri – Guy

risposta

15

Miglior risposta sono stato in grado di find è stato in qualche modo nascosto nei documenti di AWS. A titolo di esempio:

Amazon CloudSearch attualmente non fornisce un meccanismo per eliminare tutti i documenti in un dominio. Tuttavia, è possibile clonare la configurazione del dominio per ricominciare con un dominio vuoto. Per ulteriori informazioni su , vedere Cloning an Existing Domain's Indexing Options.

Fonte

: http://docs.aws.amazon.com/cloudsearch/latest/developerguide/Troubleshooting.html#ts.cleardomain

+2

sospiro; si spera che aggiungano un metodo per farlo. Mi piace fare clic sui pulsanti che fanno cose cattive in caso di incidente! – Petrogad

+0

Concordato questa funzionalità dovrebbe essere più facile. Inoltre, il tuo collegamento non sembra più contenere informazioni sulla clonazione di un dominio ... –

+1

Ma ho trovato le informazioni su http://awsdocs.s3.amazonaws.com/cloudsearch/2011-02-01/cloudsearch-dg-2011 -02-01.pdf - sfortunatamente il processo si blocca indefinitamente per me, a parte il fatto di non essere unideale dato che dovrei rintracciare tutti i riferimenti all'endpoint da aggiornare. –

3

ho fatto quanto segue, utilizzando l'adattatore di pitone, boto, a cloudsearch vuota. Non è bello ma ha fatto il lavoro. La parte difficile è il bilanciamento della quantità che si recupera all'interno della limitazione di cloudsimages 5mb.

count = CloudSearchAdaptor.Instance().get_total_documents() 
    while count > 0: 
     results = CloudSearchAdaptor.Instance().search("lolzcat|-lolzcat", 'simple', 1000) 
     for doc in results.docs: 
      CloudSearchAdaptor.Instance().delete(doc['id']) 

     CloudSearchAdaptor.Instance().commit() 
     #add delay here if cloudsearch takes to long to propigate delete change    
     count = CloudSearchAdaptor.Instance().get_total_documents() 

Cloudsearch classe adattatore simile a quanto segue:

from boto.cloudsearch2.layer2 import Layer2 
from singleton import Singleton 

@Singleton 
class CloudSearchAdaptor: 

    def __init__(self): 
     layer2 = Layer2(
      aws_access_key_id='AWS_ACCESS_KEY_ID', 
      aws_secret_access_key='AWS_SECRET_ACCESS_KEY', 
      region='AWS_REGION' 
     ) 
     self.domain = layer2.lookup('AWS_DOMAIN')) 
     self.doc_service = self.domain.get_document_service() 
     self.search_service = self.domain.get_search_service() 

@staticmethod 
def delete(id): 
    instance = CloudSearchAdaptor.Instance() 
    try: 
     response = instance.doc_service.delete(id) 
    except Exception as e: 
     print 'Error deleting to CloudSearch' 

@staticmethod 
def search(query, parser='structured', size=1000): 
    instance = CloudSearchAdaptor.Instance() 
    try: 
     results = instance.search_service.search(q=query, parser=parser, size=size) 
     return results 
    except Exception as e: 
     print 'Error searching CloudSearch' 

@staticmethod 
def get_total_documents(): 
    instance = CloudSearchAdaptor.Instance() 
    try: 
     results = instance.search_service.search(q='matchall', parser='structured', size=0) 
     return results.hits 
    except Exception as e: 
     print 'Error getting total documents from CloudSearch' 

@staticmethod 
def commit(): 
    try: 
     response = CloudSearchAdaptor.Instance().doc_service.commit() 
     CloudSearchAdaptor.Instance().doc_service.clear_sdf() 
    except Exception as e: 
     print 'Error committing to CloudSearch' 
0

su PHP, sono riuscito a creare uno script per la pulizia di tutti i record che utilizzano l'AWS PHP SDK:

clean.php - http://pastebin.com/Lkyk1D1i config.php - http://pastebin.com/kFkZhxCc

È necessario configurare le chiavi su config.php e gli endpoint su clean.php, scarica l'SDK PHP AWS e sei a posto !!!

Nota pulirà solo 10000 documenti max. come Amazon ha un limite.

4

Da parte mia, ho usato uno script nodejs locale, in questo modo:

var AWS = require('aws-sdk'); 

AWS.config.update({ 
    accessKeyId: '<your AccessKey>', 
    secretAccessKey: '<Your secretAccessKey>', 
    region: '<your region>', 
    endpoint: '<your CloudSearch endpoint' 
}); 

var params = { 
     query:"(or <your facet.FIELD:'<one facet value>' facet.FIELD:'<one facet value>')", 
     queryParser:'structured' 
}; 


var cloudsearchdomain = new AWS.CloudSearchDomain(params); 
cloudsearchdomain.search(params, function(err, data) { 
    var fs = require('fs'); 
    var result = []; 
    if (err) { 
     console.log("Failed"); 
     console.log(err); 
    } else { 
     resultMessage = data; 
     for(var i=0;i<data.hits.hit.length;i++){ 
      result.push({"type":"delete","id":data.hits.hit[i].id}); 
     }  

     fs.writeFile("delete.json", JSON.stringify(result), function(err) { 
      if(err) {return console.log(err);} 
     console.log("The file was saved!"); 
     }); 
    } 
}); 

Dovete sapere almeno tutti i valori di on sfaccettature, per essere in grado di richiedere tutti gli ID. Nel mio codice, inserisco solo 2 (nella sezione (o ....)), ma è possibile avere di più.

Una volta terminato, è necessario eliminare uno .JSON file da utilizzare con AWS-CLI con il comando:

aws cloudsearchdomain upload-documents --documents delete.json --content-type application/json --endpoint-url <your CloudSearch endpoint> 

... che ha fatto il lavoro per me!

Nekloth

+1

La query può essere un po 'più efficiente se si hanno campi obbligatori (nome_applicazione nel mio caso.Quindi, sarà ** 'query:" (non nome_applicazione:' ') "' * * – Nek

+0

Grazie, ho funzionato alla grande, ho dovuto aggiungere la dimensione param alla ricerca per ottenere tutti i miei documenti – jneptune

0

versione Java di seguito per cancellare tutti i dati all'interno di un dominio di ricerca nuvola:

private static final AmazonCloudSearchDomain cloudSearch = Region 
     .getRegion(Regions.fromName(CommonConfiguration.REGION_NAME)) 
     .createClient(AmazonCloudSearchDomainClient.class, null, null) 
     .withEndpoint(CommonConfiguration.SEARCH_DOMAIN_DOCUMENT_ENDPOINT); 

public static void main(String[] args) { 

    // retrieve all documents from cloud search 
    SearchRequest searchRequest = new SearchRequest().withQuery("matchall").withQueryParser(QueryParser.Structured); 
    Hits hits = cloudSearch.search(searchRequest).getHits(); 

    if (hits.getFound() != 0) { 
     StringBuffer sb = new StringBuffer(); 
     sb.append("["); 

     int i = 1; 
     // construct JSON to delete all 
     for (Hit hit : hits.getHit()) { 
      sb.append("{\"type\": \"delete\", \"id\": \"").append(hit.getId()).append("\"}"); 
      if (i < hits.getHit().size()) { 
       sb.append(","); 
      } 
      i++; 
     } 

     sb.append("]"); 

     // send to cloud search 
     InputStream documents = IOUtils.toInputStream(sb.toString()); 
     UploadDocumentsRequest uploadDocumentsRequest = new UploadDocumentsRequest() 
       .withContentType("application/json").withDocuments(documents).withContentLength((long) sb.length()); 
     cloudSearch.uploadDocuments(uploadDocumentsRequest); 
    } 
} 
8

Utilizzando aws e jq dalla riga di comando (testato con bash su Mac):

export CS_DOMAIN=https://yoursearchdomain.yourregion.cloudsearch.amazonaws.com 

# Get ids of all existing documents, reformat as 
# [{ type: "delete", id: "ID" }, ...] using jq 
aws cloudsearchdomain search \ 
    --endpoint-url=$CS_DOMAIN \ 
    --size=10000 \ 
    --query-parser=structured \ 
    --search-query="matchall" \ 
    | jq '[.hits.hit[] | {type: "delete", id: .id}]' \ 
    > delete-all.json 

# Delete the documents 
aws cloudsearchdomain upload-documents \ 
    --endpoint-url=$CS_DOMAIN \ 
    --content-type='application/json' \ 
    --documents=delete-all.json 

Per maggiori informazioni su jq vedi Reshaping JSON with jq

aggiornamento Feb 22, 2017

Aggiunto --size per ottenere il numero massimo di documenti (10.000) alla volta. Potrebbe essere necessario ripetere questo script più volte. Inoltre, --search-query può richiedere qualcosa di più specifico, se si desidera essere selettivi sui documenti eliminati.

+0

Ecco uno script di bash che usa la risposta di @kevin-tonon, e aggiunge il loop e un output di stato che ti dice quanti documenti ci sono: https://gist.github.com/jthomerson/ca06245d316d485252579a7d42630095 –

0

Sono riuscito a creare uno script PowerShell per questo. Controllare il mio sito qui: http://www.mpustelak.com/2017/01/aws-cloudsearch-clear-domain-using-powershell/

Script:

$searchUrl = '[SEARCH_URL]' 
$documentUrl = '[DOCUMENT_URL]' 
$parser = 'Lucene' 
$querySize = 500 

function Get-DomainHits() 
{ 
    (Search-CSDDocuments -ServiceUrl $searchUrl -Query "*:*" -QueryParser $parser -Size $querySize).Hits; 
} 

function Get-TotalDocuments() 
{ 
    (Get-DomainHits).Found 
} 

function Delete-Documents() 
{ 
    (Get-DomainHits).Hit | ForEach-Object -begin { $batch = '[' } -process { $batch += '{"type":"delete","id":' + $_.id + '},'} -end { $batch = $batch.Remove($batch.Length - 1, 1); $batch += ']' } 

    Try 
    { 
     Invoke-WebRequest -Uri $documentUrl -Method POST -Body $batch -ContentType 'application/json' 
    } 
    Catch 
    { 
     $_.Exception 
     $_.Exception.Message 
    } 
} 

$total = Get-TotalDocuments 
while($total -ne 0) 
{ 
    Delete-Documents 

    $total = Get-TotalDocuments 

    Write-Host 'Documents left:'$total 
    # Sleep for 1 second to give CS time to delete documents 
    sleep 1 
} 
Problemi correlati