2017-08-01 5 views
0

私は同じバージョンの1.5.6.RELEASEspring-boot-starter-data-elasticsearchのアプリケーションを使用しています。Spring Data ElasticsearchのLong型ではなくString型のフィールドのIDを自動生成しません

私は、などのモデルGreetingを持っている:

@Document(indexName = "index", type = "greetings") 
public class Greeting implements Serializable{ 
    @Id 
    private Long id; 
    private String username; 
    // Getter, Setter and constructor added here 
} 

は私のコントローラやサービスのクラスはidの種類せずに、以下の例のために同じです。私は以下のPOSTリクエストを送信した

curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is test"}' http://localhost:8080/api/greetings 

それは返信:

{"id":null,"username":"sunkuet02","message":"this is test"} 

は、その後、私はStringに idの種類を変更する Greetingクラスを変更しました。

@Document(indexName = "index", type = "greetings") 
public class Greeting implements Serializable{  
    @Id 
    private String id;  
    private String username; 
    // Getter, Setter and constructor added here 
} 

クリーン、同じPOSTリクエストの構築と送信:

curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is test"}' http://localhost:8080/api/greetings 

を、以下の応答だ:シナリオはある

{"id":"AV2cq2OXcuirs1TrVgG6","username":"sunkuet02","message":"this is test"} 

を:idフィールドのタイプがある場合にはLongそれはidを自動的に生成しませんが、タイプがStringならばid au徹底的に

私の質問は以下のとおりです。

  • 実際の理由は何ですか?
  • spring-data-elasticsarchは、Stringのフィールドは常にidフィールドを使用しますか?
  • idタイプがLongで、注釈を追加することなく設定する方法はありますか。

答えて

1

春データElasticsearchId_idタイプがStringであるとして内部_idを使用しています。ドキュメントフィールドで@Idを使用し、データ型がStringの場合、バネデータESは内部_idをフィールドにマップしました。しかし、数値(Long、Integerなど)のデータ型を使用すると、バネデータESは自動的に生成された_idを@Idフィールドにマップできません。 ESで文書を見ると、文書IDフィールドがヌルで、_idが自動生成値を取得することがわかります。

自分でできることは、idを生成して文書に設定すると、スプリングデータESはそのフィールドの文字列値を内部_idフィールドに設定します。そして、あなたの文書idフィールドにあなたが設定した値が入っていることがわかります。

2

私はこの部分を説明します:

実際の理由は何ですか? spring-data-elasticsarchは常にString型のidフィールドを使用しますか?

デフォルトでElasticsearchによって生成されるIDは、20文字の長さのURLで安全なBase64エンコードGUID文字列です。

理由は、もちろん、パフォーマンス - 修正フレークIDを使用すると、データのインデックス作成中に1秒あたりのルックアップの数を増やすことができます。一般的に言えば、Luceneのセグメントベースの性質は、セグメントに割り当てられているか、またはある程度の予測可能性を持っているようなパターンを持つIDを促進します。

あなたのアプリケーションがIDの外観に本当に気にしない場合は、Elsticsearchが提供するデフォルトのIDに固執する方がよいでしょう。

詳細はこちらarticle、セクションauto idを使用するか、良いIDをとして選択してください。

関連する問題