Elasticsearchをデータリポジトリとして使用することを計画しているシステムを開発しています。私は、elasticsearchからのデータにインデックスを付けてクエリできるアプリケーションを開発するための最良の方法を選択しようとしています。私が持っているシステムは、Springフレームワークの上に構築されています。
Spring-data-elasticsearch( https://github.com/spring-projects/spring-data -elasticsearch )?
または、elasticsearchコアライブラリ自体を使用するのが良い選択ですか?
ネストされたデータ(内部オブジェクト)を処理する必要がありますが、最近Spring-data-elasticsearchには操作がありません。
私は質問の解決策を見つけることができると思います。前もって感謝します。
Springデータelasticsearchは、ネスト、内部オブジェクト、親子(最近)など、elasticsearchのほとんどの共通機能セットをサポートします。
使いたいと言ったとき ネストされたデータ(内部オブジェクト)elasticsearchには、内部オブジェクトと入れ子オブジェクトという2つの概念があるため、明確にしてください。
詳細な説明は elasticsearchの管理関係 にあります。
個人エンティティ:
@Document(indexName = "person" , type = "user")
public class Person {
@Id
private String id;
private String name;
@Field( type = FieldType.Nested)
private List<Car> car;
// setters-getters
}
車のエンティティ:
public class Car {
private String name;
private String model;
//setters and getters
}
データのセットアップ:
Person foo = new Person();
foo.setName("Foo");
foo.setId("1");
List<Car> cars = new ArrayList<Car>();
Car subaru = new Car();
subaru.setName("Subaru");
subaru.setModel("Imprezza");
cars.add(subaru);
foo.setCar(cars);
インデックス付け:
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(foo.getId());
indexQuery.setObject(foo);
//creating mapping
elasticsearchTemplate.putMapping(Person.class);
//indexing document
elasticsearchTemplate.index(indexQuery);
//refresh
elasticsearchTemplate.refresh(Person.class, true);
検索中:
QueryBuilder builder = nestedQuery("car", boolQuery()
.must(termQuery("car.name", "subaru"))
.must(termQuery("car.model", "imprezza")));
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build();
List<Person> persons = elasticsearchTemplate.queryForList(searchQuery, Person.class);
Nested Object Tests で、ネストされたオブジェクトと内部オブジェクトに関するテストケースをさらに見つけることができます。
Springデータelasticsearchはトランスポートクライアントを使用し、トランスポートクライアントはAWS elasticsearchでサポートされていません。 AWS elasticsearchはHTTPクライアントのみをサポートします。したがって、elasticsearchの最良のJavaクライアントはJESTです。IAMを使用したAWS認証のサポートも提供します。
IndexQueryを使用して、保存と更新を行うことができます。
public Serializable saveOrUpdate(Car car) {
return template.index(new IndexQueryBuilder().withObject(car).build());
}