2016-05-17 6 views
7

私は、Elasticバージョン2.2.0のSpring Data Elasticsearch 2.0.1を使用しています。Spring Data Elasticsearch id vs. _id

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

_idメタデータ・フィールドが正しく読み込まれますリポジトリを使用してESにオブジェクトを保存:

私のDAOは似ています。 idフィールドのgetterメソッドとsetterメソッドは、_idメタデータフィールドの値を正しく返します。しかし、_sourceフィールド内のidフィールドはnullです。

2つの質問: 1)なぜidフィールドがnullですか? 2)idフィールドがnullであることは重要ですか?

+0

ESに独自のIDを生成させたり、自分のIDを提供したりしていますか?つまり、あなたは 'MyDao.setId(" abcdxyz ")'を呼んでいますか? – Val

+0

私はESに独自のIDを生成させます。 IDの自動生成を使用して、両方のフィールドにIDを表示することはできますか? – wxkevin

+0

@wxkevin別の質問ですが、あなたのポームを共有できますか?私はspring-data-elasticsearch 2を使用しようとしている間にエラーで立ち往生しています:[question-link](http://stackoverflow.com/questions/37047845/cannot-use-custom-autoconfiguration-with-spring-data-elasticsearch/ 37107628) –

答えて

9

ESに独自のIDを生成させる、つまりMyDao.setId("abcdxyz")を呼び出すことはないため、_sourceにはidフィールドに値を設定することはできません。何が起こっている

は、あなた自身のIDを生成し、setId("yourid")を呼び出す場合、その後、春データESは、ドキュメントの_idの値として使用しても_source.idフィールドにその値を保持するということです。つまり、_source.idはnullになりません。

setId()を呼び出さないと、_source.idはnullになり、ESは独自のIDを生成します。あなたがgetId()を呼び出すと、春データESはあなたの_idフィールドの値を返すことを確認し、ない_source.idそれはあなたの2番目の質問に答えるために@Id

で注釈を付けていますので、_source.idフィールドがNULLであることは重要ではありませんでしょう...あなたがそれを参照する必要がない限り。 Spring Data ESは、ES内の基底のidフィールドがnullであっても、JSONドキュメントをJavaエンティティにマッピングするときに、常にそれを設定します。

+0

IDを生成してIDフィールドでそのIDを使用する方法はありません。 – wxkevin

+1

はい、ES IDは '_source.id'とは異なる' _id'フィールドに格納されます(またはそのフィールドに指定する名前)。最良の方法は独自のIDを生成して 'setId()'を呼び出すことです。 – Val

+1

id属性に@JsonIgnoreを使用しましたが、そのフィールドはESでは作成されていません! – Wendel

関連する問題