いくつかのフィールドを指定せずに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")。デルタ更新を行う
は
私の場合、ドキュメントが存在しない場合はインデックスを作成し、単一クエリの場合は更新する必要があります。 –
はい、それは特定のIDへの通常の投稿で起こります。しかし、部分的な更新や新しく挿入する場合は、ドキュメントが存在するかどうかを知る必要があり、ElasticSearchの1回の操作ではできないと思います。 ESでは文書を更新することは決してありません。追加や削除ができるのは「更新」だけで、新しいエントリが作成され、古いものが削除されます。作成または更新を発行する前に文書が存在するかどうかを確認できない理由はありますか? – Peter