如何使用Java从文档中删除与elasticsearch中的模式匹配的字段?

时间:2016-06-01 19:58:51

标签: elasticsearch elasticsearch-java-api

我抓取了一些文档并在elasticsearch中创建了一个索引。我使用sense来查询:

这是我在elasticsearch中的查询:

POST /index/_update_by_query
{
  "script": {
    "inline": "ctx._source.remove(\"home\")"
  },
  "query": {
        "wildcard": {
          "url": {
            "value": "http://search.com/*"
    }
  }
}

}

这是我的Java程序:

 Client client = TransportClient.builder().addPlugin(ReindexPlugin.class)
        .build().addTransportAddress(new InetSocketTransportAddress(
            InetAddress.getByName("127.0.0.1"), 9300));

    UpdateByQueryRequestBuilder ubqrb = UpdateByQueryAction.INSTANCE
        .newRequestBuilder(client);

    Script script1 = new Script("ctx._source.remove" +FieldName);

    BulkIndexByScrollResponse r = ubqrb.source("index").script(script1)
        .filter(wildcardQuery("url", patternvalue)).get();

FieldName(其中home保存为字符串)是我要从文档中删除的字段的名称。 patternvalue是模式" http://search.com/ *"被储存了。当我运行这个Java程序时,它不会从我的文档中删除主页。它在我的文档中添加了一个名为remove的新字段。我可能会遗漏一些东西。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

如果FieldName是字符串home,则表达式"ctx._source.remove" +FieldName将等于"ctx._source.removehome",这不是正确的脚本。该行的正确代码是:

Script script1 = new Script("ctx._source.remove(\"" + FieldName + "\")");

这样脚本将是:

ctx._source.remove("home")

这和你在json中写的相同:

"inline": "ctx._source.remove(\"home\")"

\"在json只是"在json语法中转义了)