2

Java には、ドメイン クラス Foo があります。id フィールドがあります。Springdata は、このフィールドを「_id」ではなく「id」という名前に自動的にマップします。この ID を _id フィールドに再マップする方法はありますか?

public class Foo  {
    @Id
    @Field(type = FieldType.String, store = true)
    private String id;
}

したがって、findById(String id) を実行すると、find by は、エラスティック検索によって生成された _id ではなく、ドメイン オブジェクトの id フィールドを使用します。

findBy_Id(String id) という名前のメソッドを作成しようとしましたが、Spring データ ライブラリは、このフィールドがモデルに存在しないと文句を言います。これを機能させるために、すべてのオブジェクトの id プロパティの名前を _id に変更する必要はありませんでした。

4

1 に答える 1

2

Fooクラス定義を変更して、インデックス名と型パラメーターを定義します。

@Document(indexName = "foo",type = "foo")
public class Foo  {
    @Id
    @Field(type = FieldType.String, store = true)
    private String id;
}

Springデータを使用していると仮定します。FooRepository以下に示すようにを作成しておく必要があります。

public interface FooRepository extends ElasticsearchRepository<Foo,String> {

}

Elasticsearch でオブジェクトにsaveインデックスを付けるには、メソッドを使用する必要があります。Foo

Foo objFoo = new Foo();
objFoo.setId("123");

objFooRepository.save(objFoo);

弾性検索は、foo という名前の新しいインデックスを作成し、foo をタイプすることによって、ドキュメント objFoo にインデックスを付けます。

{
    "_index": "foo",
    "_type": "foo",
    "_id": "123",
    "_score": 1,
    "_version": 1,
    "_source": {
        "id": "123"
    }
}

findOne()リポジトリのメソッドを使用して、索引付けされたドキュメントを取得します。

Foo indexedFoo = repository.findOne(objFoo.getId());
于 2014-12-06T00:18:37.730 に答える