Как очистить все данные от AWS CloudSearch?
У меня есть экземпляр AWS CloudSearch, который я все еще разрабатываю.
Иногда, например, когда я вношу некоторые изменения в формат поля, я нахожусь в том, что хочу уничтожить все данные и восстановить его.
Есть ли способ очистить все данные с помощью консоли, или мне нужно сделать это с помощью программных средств?
Если мне нужно использовать программные средства (т.е. сгенерировать и POST кучу "удалить" SDF файлы) есть ли хороший способ запросить все документы в экземпляре CloudSearch?
Я думаю, я мог бы просто удалить и повторно создать экземпляр, но thattakes некоторое время, и теряет все индексы/ранговые выражения/параметры текста/etc
Ответы
Ответ 1
Лучший ответ, который я смог найти, был несколько похож на документы AWS. К остроумию:
Amazon CloudSearch в настоящее время не предоставляет механизм для удаления все документы в домене. Однако вы можете клонировать домен чтобы начать с пустого домена. Для большего информацию, см. Клонирование существующих параметров индексирования домена.
Источник: http://docs.aws.amazon.com/cloudsearch/latest/developerguide/Troubleshooting.html#ts.cleardomain
Ответ 2
Используя aws и jq из командной строки (проверено с помощью bash на 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
Для получения дополнительной информации о jq см. Изменение формы JSON с jq
Обновление 22 февраля 2017 г.
Добавлено --size
, чтобы получить максимальное количество документов (10 000) за раз. Возможно, вам придется повторять этот script несколько раз. Кроме того, --search-query
может принимать что-то более конкретное, если вы хотите быть выборочным о удалении документов.
Ответ 3
Я делал следующее, используя адаптер python, boto, чтобы очистить облачный поиск. Не очень, но он выполняет свою работу. Трудная часть - это балансировка суммы, которую вы получаете, в пределах ограничения облака 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 выглядит примерно так:
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'
Ответ 4
На моей стороне я использовал локальный nodejs script следующим образом:
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!");
});
}
});
Вы должны знать, по крайней мере, все значения фасетов, чтобы иметь возможность запрашивать все идентификаторы. В моем коде я просто положил 2 (в разделе (или....)), но вы можете иметь больше.
Как только это будет сделано, у вас будет один файл delete.json, который будет использоваться с AWS-CLI с помощью этой команды:
aws cloudsearchdomain upload-documents --documents delete.json --content-type application/json --endpoint-url <your CloudSearch endpoint>
... это помогло мне!
Nekloth
Ответ 5
На PHP мне удалось создать script для очистки всех записей с помощью AWS PHP SDK:
clean.php - http://pastebin.com/Lkyk1D1i
config.php - http://pastebin.com/kFkZhxCc
Вам нужно будет настроить свои ключи на config.php и конечных точках на clean.php, загрузить AWS PHP SDK, и вам хорошо идти!!!
Обратите внимание, что он очистет только 10000 документов. поскольку у Amazon есть предел.
Ответ 6
Следующая версия Java для очистки всех данных в домене облачного поиска:
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);
}
}
Ответ 7
Мне удалось создать PowerShell script для него. Проверьте мой сайт здесь: 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
}