Ich bin kürzlich auf dieses Problem mit ElasticSearch Indexierung in Java gestoßen. Wenn Sie einen Datensatz aus serialisiertem JSON-Byte-Array in ElasticSearch schreiben, fehlt eines der Felder oder wird gelöscht.ElasticSearch löscht ein Feld bei der Indizierung mit Java
Die hübsche druckte byte[] content
Beispiel:
{
"created_at": 1468390585000,
"name": "Lucy",
"id": 123,
"message": "Hi how are you",
"thread_id": 456,
"user_id": 789
}
Der Index Aufruf Java:
IndexRequest indexRequest = new IndexRequest(INDEX, TYPE, data.getId().toString())
.source(content)
.versionType(VersionType.EXTERNAL)
.version(data.getCreatedAt().getTime());
In der Indizierung, werden alle Felder mit Ausnahme des name
in Folge vorhanden sind:
GET /my_index/post/123
{
"_index": "my_index",
"_type": "post",
"_id": "123",
"_version": 1468390585000,
"found": true,
"_source": {
"id": 123,
"user_id": 456,
"created_at": 1468390585000,
"message": "Hi how are you",
"thread_id": 789
}
}
name
ist ein neues Feld, das ich neu erstellt habe. Es ist in der Abbildung:
{
"my_index":{
"mappings":{
"post":{
"properties":{
"created_at":{
"type":"long"
},
"name":{
"type":"string"
},
"id":{
"type":"long"
},
"message":{
"type":"string",
"analyzer":"english_text"
},
"thread_id":{
"type":"long"
},
"user_id":{
"type":"long"
}
}
}
}
}
}
Andere Felder wurden mit der Schaffung des post
Typs erstellt.
Ich vermute, dass es eine Art von Filterung beim Schreiben/Indizieren der Daten in Java API gibt. Ich kann PUT
die gleiche JSON in der Befehlszeile und siehe name
im Ergebnis enthalten. Es scheint, dass nur die Java API das Feld fallen lässt. Aber ich bin mir nicht sicher.
Wenn Sie irgendwelche Ideen haben, werde ich es zu schätzen wissen!