services pricing glue cloudsearch calculate calculadora aws amazon-web-services amazon-cloudsearch

amazon web services - pricing - ¿Cómo borrar todos los datos de AWS CloudSearch?



cloudsearch vs elasticsearch (8)

Tengo una instancia de AWS CloudSearch que todavía estoy desarrollando.

En ocasiones, como cuando realizo alguna modificación en el formato de un campo, me parece que quiero borrar todos los datos y volver a generarlo.

¿Hay alguna manera de borrar todos los datos usando la consola, o tengo que hacerlo por medios programáticos?

Si tengo que usar medios programáticos (es decir, generar y enviar un montón de archivos SDF "eliminar"), ¿hay alguna forma de consultar todos los documentos en una instancia de CloudSearch?

Creo que podría simplemente eliminar y volver a crear la instancia, pero eso demora un tiempo, y pierde todos los índices / expresiones de rango / opciones de texto / etc.


En PHP, logré crear un script para limpiar todos los registros usando AWS PHP SDK:

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

Tendrá que configurar sus claves en config.php y sus puntos finales en clean.php, descargue AWS PHP SDK, ¡y listo!

Tenga en cuenta que solo limpiará 10000 documentos como máximo. como Amazon tiene un límite.


He estado haciendo lo siguiente, usando el adaptador de python, boto, para vaciar Cloudsearch. No es bonita, pero hace el trabajo bien. La parte difícil es equilibrar la cantidad que busca dentro de la limitación cloudbusarch 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()

La clase de adaptador Cloudsearch se parece a lo siguiente:

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


La mejor respuesta que he podido encontrar estaba algo oculta en los documentos de AWS. Esto es:

Amazon CloudSearch actualmente no proporciona un mecanismo para eliminar todos los documentos en un dominio. Sin embargo, puede clonar la configuración del dominio para comenzar nuevamente con un dominio vacío. Para obtener más información, vea Clonación de las opciones de indexación de un dominio existente .

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


La siguiente versión de Java para borrar todos los datos dentro de un dominio de búsqueda en la nube:

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); } }


Por mi parte, utilicé un script nodejs local como este:

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!"); }); } });

Debe saber al menos todos los valores de las facetas, para poder solicitar todas las ID. En mi código, acabo de poner 2 (en la sección (o ...) ), pero puedes tener más.

Una vez hecho, tiene un archivo delete.json para usar con AWS-CLI usando este comando:

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

... que hizo el trabajo por mí!

Nekloth


Pude crear un script de PowerShell para él. Visite mi sitio web aquí: http://www.mpustelak.com/2017/01/aws-cloudsearch-clear-domain-using-powershell/

Guión:

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


Puede subir manualmente el lote del documento directamente a AWS CloudSearch, Panel> Cargar documento. Si puede enumerar todos los identificadores de índice que desea eliminar, puede crear un script para generar un lote de documentos o generarlo manualmente.

el formato del lote de documentos debería ser así

sample.json

[ { "type": "delete", "id": "1" }, { "type": "delete", "id": "2" } ]

Cómo enumerar todos los índices: ejecute una búsqueda de prueba

  • Buscar: id: * (o cualquier campo seguro que estará disponible para todos)
  • Analizador de consultas: Lucene

Usando aws y jq desde la línea de comando (probado con bash en 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

Para obtener más información sobre jq, consulte Rehaping JSON with jq

Actualización 22 de feb, 2017

Agregó --size para obtener la cantidad máxima de documentos (10,000) a la vez. Es posible que deba repetir este script varias veces. Además, --search-query puede tomar algo más específico, si desea ser selectivo sobre la --search-query los documentos.