2017-08-22 243 views
2

当我试图在没有指定某些字段的情况下更新elasticsearch中的文档时,它将该字段更新为null。这是我使用的代码。用于索引文档如何在更新Elasticsearch文档时忽略空值的字段?

public class DocumentModel { 
@Id 
private String id; 
private Integer name; 
private String gender; 
private String url; 
private String documentID; 
------------------ 
------------------ 
getters and setters 
} 

代码是:

Gson gson = new GsonBuilder().serializeNulls().create(); 
String json = gson.toJson(documentModel); 
IndexRequest indexRequest = new IndexRequest(indexName, typeName, documentModel.getId()); 
indexRequest.source(json); 
UpdateRequest updateRequest = new UpdateRequest(indexName, typeName, documentModel.getId()); 
updateRequest.doc(json); 
updateRequest.upsert(indexRequest); 
updateRequest.fields("documentID"); 
UpdateResponse updateResponse = elasticsearchTemplate.getClient().update(updateRequest).actionGet(); 

假设输入(文档模型)的(索引文件第一次):

{"id":1,"name":"tom","gender":"male","url":"http://www.google.com","documentID":1} 

它将索引为:

{ 
     "_index": "index", 
     "_type": "type", 
     "_id": "1", 
     "_score": 1, 
     "_source": { 
      "name":"tom", 
      "gender":"male", 
      "url":"http://www.google.com", 
      "documentID":1 
     } 
    } 

但是,当我trie d更新同一个文档与输入:

{"id":1,"name":"archana","gender":"female"} 

它将作为更新:

{ 
      "_index": "index", 
      "_type": "type", 
      "_id": "1", 
      "_score": 1, 
      "_source": { 
       "name":"archana", 
       "gender":"female", 
       "url":null, 
       "documentID":null 
      } 
     } 

的问题是,不作为输入给定的字段(例如“URL”,“documentID”)被设置为null,而更新document.but但我希望该字段仍然是旧值,除非值不为空(例如,“url”:“http://www.google.com”)。

回答

0

做增量更新是通过弹性支持使用_Update REST API调用,所以我想,如果你做的

updateRequest.update(indexRequest) 

代替

updateRequest.upsert(indexRequest) 

注意了Java API应该做同样的是如果文档不存在,则显式更新将失败,因此您需要在发出更新命令之前检查它。

提供弹性和Java API的版本将是有益的

+0

在我的情况下,我需要索引文件,如果不存在和更新,如果存在单个查询 –

+0

是的,这是一个普通的职位上会发生什么特定的ID。但是,如果您打算进行部分更新或重新插入,则必须知道文档是否存在,并且我认为这不能在ElasticSearch的单个操作中完成。在ES中,您从不真正更新文档,只能添加和删除文档,任何“更新”都会创建一个新条目并将旧条目标记为删除。在发布创建或更新之前,您是否有理由不能检查文档是否存在? – Peter

1

我觉得你的问题是serializeNullsThe docs say

配置Gson序列化空字段。默认情况下,Gson在序列化过程中省略所有空字段。

我认为这意味着你发送到Elasticsearch的请求,看起来像:

POST /index/type/1/_update 
{ 
    "doc": { 
    "name":"archana", 
    "gender":"female", 
    "url":null, 
    "documentID":null 
    } 
} 

它告诉你要与null写了这些值Elasticsearch。如果你不想写他们,你需要完全摆脱他们的要求,我认为你可以通过摆脱serializeNulls()电话完成。

这是你必须在你的代码或脚本更新中处理的东西(虽然我想不出你会这么做的原因,除非你不控制代码发出请求),或者您可以编写一个插件来添加此行为。

+0

Thanks.But我想ES中的一个选项,避免更新空值 –

+0

我不认为这是可能的,除了脚本更新(这对我来说没有多大意义),或者如果您编写并安装插件来添加此行为。也许你可以更新这个问题来解释为什么你不能在你的代码中处理这个问题,而有人更可能提出一个可以满足你需求的替代解决方案? – dshockley

相关问题