20

Я разрабатываю систему, которая планирует использовать elasticsearch в качестве хранилища данных. Я пытаюсь выбрать лучший способ разработки моего приложения, которое может индексировать и запрашивать данные из elasticsearch. Система, которая у меня есть, построена на основе весеннего каркаса.Лучший способ использования ElasticSearch в структуре java весны

Это хороший выбор для использования Spring-data-elasticsearch (https://github.com/spring-projects/spring-data-elasticsearch)?

Или это хороший выбор для использования сами библиотеки ящиков elasticsearch?

Мне нужно обрабатывать вложенные данные (внутренний объект), но Spring-data-elasticsearch, похоже, не работает для этого в последнее время.

Надеюсь, я смогу найти решение вопроса. Спасибо заранее.

ответ

25

Spring elasticsearch данных поддерживает большую часть общего набора функций elasticsearch включая вложенные, внутренние объекты и Родитель ребенка (в последнее время)

, когда вы сказали, что хотите использовать вложенные данные (внутренний объект), пожалуйста, убедитесь, поскольку elasticsearch имеет два понятия Inner Object и Nested Object.

Подробное описание можно найти на сайте managing relationship in elasticsearch

Вложенный документ Пример

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 

    } 

автомобилей Entity



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

Настройка данных



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

Индексация



     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 persons = elasticsearchTemplate.queryForList(searchQuery, Person.class); 

вы можете найти больше тестовых данных о вложенных и Inner объекта в Nested Object Tests

+0

Где вы размещаете пример? кажется, вы не можете вводить пользовательские методы внутри elasticsearchrepository для реализации. – Maxrunner

+0

Также как вы используете разбиение на страницы с этим, можно ли использовать класс Pageable? – Maxrunner

+3

Я не могу найти примеры для обновления данных –

1

Вы можете использовать IndexQuery для сохранения и обновления:

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

Spring elasticsearch данных использует транспортный клиент и транспортный клиент не поддерживается AWS elasticsearch. AWS elasticsearch поддерживает только HTTP-клиенты. Поэтому я считаю, что лучшим java-клиентом для elasticsearch является JEST. Он также обеспечивает поддержку аутентификации AWS с использованием IAM.