web-dev-qa-db-fra.com

La meilleure façon d'utiliser ElasticSearch dans Spring Java framework

Je développe un système qui prévoit d'utiliser elasticsearch comme référentiel de données. J'essaie de choisir la meilleure façon de développer mon application qui peut indexer et interroger des données depuis elasticsearch. Le système que j'ai est construit sur le framework Spring.

Est-ce un bon choix à utiliser Spring-data-elasticsearch ( https://github.com/spring-projects/spring-data -elasticsearch )?

Ou est-ce un bon choix d'utiliser les bibliothèques de base elasticsearch lui-même ?

J'ai besoin de gérer des données imbriquées (objet interne) mais Spring-data-elasticsearch semble n'avoir aucune opération récemment.

J'espère que je peux trouver une solution à la question. Merci d'avance.

23
Hosang Jeon

Spring data elasticsearch prend en charge la plupart des fonctionnalités communes d'elasticsearch, y compris les objets imbriqués, internes et parent-enfant (récemment).

Quand tu as dit que tu veux utiliser données imbriquées (objet interne), veuillez être clair car elasticsearch a deux concepts: objet interne et objet imbriqué.

Une explication détaillée peut être trouvée sur gestion des relations dans elasticsearch

Exemple de document imbriqué

Entité personne:

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

Entité de voiture:

public class Car {
    private String name;
    private String model;
    //setters and getters 
}

Configuration des données:

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);

Indexage:

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);

Recherche:

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);

Vous pouvez trouver plus de cas de test sur les objets imbriqués et internes à tests d'objets imbriqués

26
Mohsin Husen

Spring data elasticsearch utilise le client de transport et le client de transport n'est pas pris en charge par AWS elasticsearch. AWS elasticsearch prend uniquement en charge les clients HTTP. Je pense donc que le meilleur client Java pour elasticsearch est JEST. Il prend également en charge l'authentification AWS à l'aide d'IAM.

1
Emma

Vous pouvez utiliser IndexQuery pour enregistrer ET mettre à jour:

public Serializable saveOrUpdate(Car car) {
    return template.index(new IndexQueryBuilder().withObject(car).build());
}
1
kwntn