如何清除AWS CloudSearch中的所有数据?

big*_*mus 30 amazon-web-services amazon-cloudsearch

我有一个我仍在开发的AWS CloudSearch实例.

有时,例如当我对字段的格式进行一些修改时,我发现自己想要消除所有数据并重新生成它.

有没有办法使用控制台清除所有数据,或者我必须通过程序方式来解决它?

如果我必须使用编程方法(即生成和POST一堆"删除"SDF文件)有什么好方法可以查询CloudSearch实例中的所有文档吗?

我想我可以删除并重新创建实例,但这需要一段时间,并丢失所有索引/等级表达式/文本选项/等

Kev*_*non 17

使用命令行中的awsjq(在mac上使用bash测试):

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
Run Code Online (Sandbox Code Playgroud)

有关jq的更多信息,请参阅使用jq重塑JSON

2017年2月22日更新

添加--size以一次获取最大文档数(10,000).您可能需要多次重复此脚本.此外,--search-query如果您想要选择删除的文档,可以采取更具体的方法.

  • 这是一个 bash 脚本,它使用来自 @kevin-tonon 的答案,并添加循环以及告诉您有多少文档的状态输出:https://gist.github.com/jthomerson/ca06245d316d485252579a7d42630095 (2认同)
  • 请记住在启动 aws 命令时使用 `--output json` 以防止以不同格式输出(我在 yaml 中配置了我的) (2认同)

big*_*mus 15

我能够找到的最佳答案有点埋没在AWS文档中.以机智:

Amazon CloudSearch目前不提供删除域中所有文档的机制.但是,您可以克隆域配置以重新开始使用空域.有关更多信息,请参阅克隆现有域的索引选项.

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

  • 它现在似乎完全消失了.所以似乎这个答案不再是答案. (7认同)
  • 叹; 希望他们添加一种方法来做到这一点.我喜欢点击按钮,在事故中做坏事! (3认同)

小智 5

在我这边,我使用了这样的本地 nodejs 脚本:

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!");
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

您必须至少知道 on facets 的所有值,才能请求所有 ID。在我的代码中,我只放了 2 个(在(或 ....)部分),但你可以有更多。

完成后,您将有一个delete.json文件,可使用以下命令与 AWS-CLI 一起使用:

aws cloudsearchdomain upload-documents --documents delete.json --content-type application/json --endpoint-url <your CloudSearch endpoint>
Run Code Online (Sandbox Code Playgroud)

...这对我有用!

内克洛斯