Spring Data Elasticsearch2.0.1とElasticバージョン2.2.0を使用しています。
私のDAOは次のようなものです。
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
@Document(indexName = "myIndex")
public class MyDao {
@Id
private String id;
public String getId() { return id; }
public void setId(String id) { this.id = id; }
<other fields, setters, getters omitted>
}
リポジトリを使用してオブジェクトをESに保存すると、_id
メタデータフィールドに正しく入力されます。 id
フィールドのgetterメソッドとsetterメソッドは、_id
メタデータフィールドの値を正しく返します。ただし、_source
フィールド内のidフィールドはnullです。
2つの質問:1)idフィールドがnullなのはなぜですか? 2)idフィールドがnullであることは重要ですか?
ESに独自のIDを生成させるため、つまりMyDao.setId("abcdxyz")
を呼び出すことはないため、__source
_はid
フィールドに値を含めることはできません。
何が起こっているのかというと、独自のIDを生成してsetId("yourid")
を呼び出すと、Spring Data ESはそれをドキュメントの__id
_の値として使用し、その値を__source.id
_フィールド。これは、__source.id
_がnullにならないことを意味します。
setId()
を呼び出さない場合、__source.id
_はnullになり、ESは独自のIDを生成します。次にgetId()
を呼び出すと、Spring Data ESは__id
_で注釈が付けられているため、__source.id
_ではなく_@Id
_フィールドの値を返すようにします。
2番目の質問に答えるには、__source.id
_フィールドがnullであっても問題ありません...参照する必要がない限り。 Spring Data ESは、JSONドキュメントをJavaエンティティにマッピングするときに、ESの基になるid
フィールドがnullであっても、常にデータを入力します。