elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java 删除/更新elasticsearch上的文档字段

Java 删除/更新elasticsearch上的文档字段,java,elasticsearch,Java,elasticsearch,将一个类想象为: class DummyClass { String field1; String field2; } 我可以创建一个DummyClass对象并将其保存在ES上: DummyClass dummy = new DummyClass(); dummy.field1 = "sample1"; dummy.field2 = "sample2"; byte[] source = this.jacksonMapper.writeValueAsBytes(dummy);

将一个类想象为:

class DummyClass
{
    String field1;
    String field2;
}
我可以创建一个
DummyClass
对象并将其保存在ES上:

DummyClass dummy = new DummyClass();
dummy.field1 = "sample1";
dummy.field2 = "sample2";

byte[] source = this.jacksonMapper.writeValueAsBytes(dummy);
this.elasticsearchResources.getElasticsearchClient()
    .prepareIndex()
    .setIndex("index")
    .setType("type")
    .setSource(source)
    .request();
source
的内容是:

{
    "field1": "sample1",
    "field2": "sample2"
}
{
    "field2": "sample2"
}
因此,我需要做如下更改:
dummy.field1=null
,因此我需要删除
field1
(我不希望ES设置
field1=null

所以,我试过这个:

 dummy.field1 = null;

 byte[] source = this.jacksonMapper.writeValueAsBytes(dummy);

 this.elasticsearchResources.getElasticsearchClient()
        .prepareUpdate()
        .setIndex("index")
        .setType(type)
        .setId(id.toString())
        .setDoc(source)
        .setUpsert(source)
        .setDetectNoop(true)
        .request();
source
的内容是:

{
    "field1": "sample1",
    "field2": "sample2"
}
{
    "field2": "sample2"
}
之后,ES不会从文档中删除
field1

我不太清楚我做错了什么。

如前所述,如果再次索引,ElasticSearch将替换文档。以下内容应满足您的要求:

PUT idx/tpy/1
{"name1" : "value1", "name2" : "value2"}

POST idx/tpy/_search
{"query": {"match_all": {}}}

PUT idx/tpy/1
{"name1" : "value1"}

POST idx/tpy/_search
{"query": {"match_all": {}}}

UpdateRequest仅在使用java SDK时进行合并或部分更新。为了进行替换,请使用IndexRequest,如果文档已经存在,它将被覆盖。

一种方法是,如果您使用setter方法设置类变量,然后将其转换为map以写入ES。在这种情况下,将在写入ES时忽略哪个字段具有空值

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonInclude(JsonInclude.Include.NON_NULL)
class DummyClass
{
    String field1;
    String field2;
}
如果ES中已经有一个空字段,那么您可以做的是将文档1乘1作为映射

Map<String, Object> fieldMap = getFields.getSourceAsMap();

您确定第二个示例中的源代码如下所示吗?Elasticsearch使用提供的新Json替换整个文档。它不做任何更新,因此这意味着您发送带有field1=null的json。据我所知,更新API会尝试合并文档(请参见)。为了删除该字段,您应该提供一个脚本。。。你觉得怎么样?