web-dev-qa-db-ja.com

Spring Data Elasticsearchidと_id

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であることは重要ですか?

15
wxkevin

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であっても、常にデータを入力します。

16
Val