2016-07-15 8 views
0

最近、JavaでのElasticSearchインデックス作成でこの問題が発生しました。シリアライズされたjsonバイト配列からElasticSearchにレコードを書き込むとき、フィールドの1つが見つからないか、ドロップされます。ElasticSearchはJavaでインデックス作成のフィールドを削除します

きれいに印刷byte[] content例:

{ 
    "created_at": 1468390585000, 
    "name": "Lucy", 
    "id": 123, 
    "message": "Hi how are you", 
    "thread_id": 456, 
    "user_id": 789 
} 

のJavaインデックスコール:インデックスで

IndexRequest indexRequest = new IndexRequest(INDEX, TYPE, data.getId().toString()) 
     .source(content) 
     .versionType(VersionType.EXTERNAL) 
     .version(data.getCreatedAt().getTime()); 

、すべてのフィールドがnameを除いた結果で存在している:

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は、私が新たに作成した新しいフィールドです。

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

他のフィールドは、postタイプの作成で作成されました。

Java APIでデータの書き込み/インデックス作成に何らかのフィルタリングがあると思われます。私はPUTと同じjsonをコマンドラインで見ることができ、nameがresultに含まれていると見ることができます。 Java APIだけがフィールドを削除しているようです。しかし、私は確信していません。

ご意見がありましたら、感謝いたします。

答えて

0

新しいname属性のない既存のドキュメントがあることが判明しました。したがって同じidversionの文書を挿入すると、nameが修正され、バージョンの競合が発生します。コマンドラインからのPUTは、それが新しい文書であるために機能します。それはJavaとは関係ありません。

部分更新を行うには、update APIを使用する必要があります。

関連する問題