2017-08-22 4 views
2

いくつかのフィールドを指定せずにelasticsearchでドキュメントを更新しようとすると、フィールドがnullに更新されます。ここで私が使用したコードです。索引付け文書に使用Elasticsearch文書の更新中にnull値のフィールドを無視する方法はありますか?

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(); 

入力(documentModel)(文書初回のインデックス作成)されていると仮定:

{"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 
     } 
    } 

しかし、私はトライ入力と同じドキュメントを更新するために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を」、「文書ID」)に設定されていますdocument.butを更新している間はnullです。値がnullでないかぎり、そのフィールドは古い値のままになります(例: "url": "http://www.google.com")。デルタ更新を行う

答えて

0

_updateのREST API呼び出しを使用して弾性によってサポートされているので、私は、Java APIを使用すると、

updateRequest.update(indexRequest) 

代わり

updateRequest.upsert(indexRequest) 

注意を行う場合には同じことを行う必要があると仮定しドキュメントが存在しない場合は明示的な更新が失敗するため、updateコマンドを発行する前に確認する必要があります。

提供する弾性とJava APIのバージョンが

+0

私の場合、ドキュメントが存在しない場合はインデックスを作成し、単一クエリの場合は更新する必要があります。 –

+0

はい、それは特定のIDへの通常の投稿で起こります。しかし、部分的な更新や新しく挿入する場合は、ドキュメントが存在するかどうかを知る必要があり、ElasticSearchの1回の操作ではできないと思います。 ESでは文書を更新することは決してありません。追加や削除ができるのは「更新」だけで、新しいエントリが作成され、古いものが削除されます。作成または更新を発行する前に文書が存在するかどうかを確認できない理由はありますか? – Peter

1

有用であろう私はあなたの問題はserializeNullsだと思います。 The docs say

nullフィールドをシリアル化するようにGsonを設定します。デフォルトでは、Gsonはシリアル化中にnullのすべてのフィールドを省略します。あなたはnullでこれらの値を上書きしたいElasticsearchを伝え

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

は、私はそれはあなたがのようになりますElasticsearchにリクエストを送信していることを意味だと思います。あなたがそれらを上書きしたくなければ、あなたはそれらを完全に要求から外しておく必要があります。私はあなたがserializeNulls()コールを取り除くことによって達成できると思います。

これはあなたのコードやスクリプトアップデートで扱う必要があるものです(ただし、リクエストを行うコードを制御しない限り、そうしたいと思う理由は考えられません)。またはこの動作を追加するためのプラグインを作成することもできます。

+0

ありがとうございます。私はヌル値の更新を避けるESのオプションを望んでいます。 –

+0

スクリプトアップデート(私には意味がない)を除いて、それは可能ではないと思います。この動作を追加するプラグイン。たぶんあなたはあなたのコードでこれを処理できない理由の詳細を説明するために質問を更新することができ、誰かがあなたのニーズを満たす代替ソリューションを考え出す可能性が高いでしょうか? – dshockley

関連する問題