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.