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会尝试合并文档(请参见)。为了删除该字段,您应该提供一个脚本。。。你觉得怎么样?