我想知道Elastica或ElasticSearch是否能够从给定索引中的所有文档中删除单个字段。我在REST API中找到了正确的方法,但在尝试使用它时,它会产生语法错误。
我写了
curl -XPOST localhost:9200/products/product/O2bMZYRek5/_update -d '{
"script": "ctx._source.remove("Color")"
}'
返回
{"error":"JsonParseException[Unexpected character ('C' (code 67)): was expecting comma to separate OBJECT entries\n at [Source: [B@fddc294; line: 2, column: 32]]","status":500}
答案 0 :(得分:8)
你可以通过http api:
来做到这一点curl -XPOST 'http://localhost:9200/goods_city_1/meirong/552899/_update' -d '{
"script" : "ctx._source.remove(\"text\")"
}'
或者您可以通过java api执行此操作:
StringBuilder sb = new StringBuilder();
for(String stringField : stringFields){
sb.append("ctx._source.remove(\"").append(stringField).append("\");");
}
updateRequestBuilder.setScript(sb.toString());
我试过这个,它会起作用。 (至少0.90.2。)
如果您需要它适用于索引中的所有文档,您应该将所有这些更新操作(或每5000个操作)放入一个BulkRequest中,然后将其扔到服务器上。
或者,如果您使用别名来处理数据,“elasticsearch-reindex”(https://github.com/karussell/elasticsearch-reindex)可能会对您有所帮助。