20

Ich entwickle ein System, das die Verwendung von elasticsearch als Datenspeicher plant. Ich versuche, den besten Weg zu finden, meine Anwendung zu entwickeln, die Daten von elasticsearch indizieren und abfragen kann. Das System, das ich habe, ist auf Spring Framework gebaut.Der beste Weg, ElasticSearch im Spring Java Framework zu verwenden

Ist es eine gute Wahl zu verwenden Spring-data-elasticsearch (https://github.com/spring-projects/spring-data-elasticsearch)?

Oder ist es eine gute Wahl zu verwenden elasticsearch Kernbibliotheken selbst?

Ich muss mit verschachtelten Daten (inneres Objekt) umgehen, aber Spring-data-elasticsearch scheint in letzter Zeit keine Operationen zu haben.

Ich hoffe, ich kann eine Lösung für die Frage finden. Vielen Dank im Voraus.

Antwort

25

Frühling Daten Elasticsearch unterstützt die meisten der gemeinsamen Feature-Set von Elasticsearch einschließlich Verschachtelte, Inner Objekte und Eltern Kind (vor kurzem)

, wenn Sie sagte, dass verschachtelte Daten (innere Objekt), stellen Sie sicher, verwenden möchten, als elasticsearch hat zwei Konzept Inner Object und Nested Object.

Ausführliche Erklärung kann bei managing relationship in elasticsearch

Nested Dokument Beispiel

Person Entity

@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 

    } 

Car Entity

finden


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

Einrichten Daten



    Person foo = new Person(); 
    foo.setName("Foo"); 
    foo.setId("1"); 

    List cars = new ArrayList(); 
    Car subaru = new Car(); 
    subaru.setName("Subaru"); 
    subaru.setModel("Imprezza"); 
    cars.add(subaru); 
    foo.setCar(cars); 

Indexing



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

Suche



    QueryBuilder builder = nestedQuery("car", boolQuery().must(termQuery("car.name",  "subaru")).must(termQuery("car.model", "imprezza"))); 

    SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(builder).build(); 
    List persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); 

können Sie mehr Testfälle über Nested und innere Objekt an Nested Object Tests

finden
+0

Wo setzen Sie das Suchbeispiel? Es sieht so aus, als könnten Sie keine benutzerdefinierten Methoden in das ElasticSearch-Repository zur Implementierung einfügen. – Maxrunner

+0

Auch wie verwenden Sie Paginierung mit diesem, können wir die Klasse Ausgebbare verwenden? – Maxrunner

+3

Ich kann keine Beispiele finden, um die Daten zu aktualisieren –

1

können Sie IndexQuery verwenden für speichern und zu aktualisieren:

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

Frühling Daten Elasticsearch verwendet Transport-Client und Transport-Client von AWS Elasticsearch nicht unterstützt wird. AWS elasticsearch unterstützt nur HTTP-Clients. Also ich denke, der beste Java-Client für Elasticsearch ist JEST. Es bietet auch Unterstützung für die AWS-Authentifizierung mit IAM.

Verwandte Themen