2016-07-15 13 views
0

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!

Antwort

0

Es stellte sich heraus, dass es Dokumente ohne die neuen name Attribute gibt. Daher wird das Einfügen eines Dokuments mit denselben id und version mit geänderten name Versionskonflikte erhalten. Die PUT von der Befehlszeile funktioniert, weil es ein neues Dokument ist. Es hat nichts mit Java zu tun.

Ich sollte update API verwenden, um Teilupdate zu tun.

Verwandte Themen