searchresponse query example java spring frameworks elasticsearch spring-data-elasticsearch

query - La mejor manera de usar ElasticSearch en el framework de Java java



search request elasticsearch java (3)

Estoy desarrollando un sistema que planea usar elasticsearch como un repositorio de datos. Estoy tratando de elegir la mejor manera de desarrollar mi aplicación que pueda indexar y consultar datos de elasticsearch. El sistema que tengo está construido sobre el framework Spring.

¿Es una buena opción usar Spring-data-elasticsearch ( https://github.com/spring-projects/spring-data-elasticsearch )?

¿O es una buena opción usar las bibliotecas centrales de elasticsearch ?

Necesito manejar datos anidados (objeto interno) pero Spring-data-elasticsearch parece no tener operaciones para eso recientemente.

Espero poder encontrar una solución para la pregunta. Gracias por adelantado.


Los datos de elasticsearch de Spring utilizan el cliente de transporte, y el cliente de transporte no es compatible con elasticsearch de AWS. AWS elasticsearch solo admite clientes HTTP. Así que creo que el mejor cliente de java para elasticsearch es JEST. También proporciona soporte para la autenticación AWS utilizando IAM.


Puedes usar IndexQuery para guardar Y actualizar:

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


Spring data elasticsearch es compatible con la mayoría de las características comunes de elasticsearch, incluyendo Nested, Inner Objects y Parent Child (recientemente).

Cuando haya dicho que desea utilizar datos anidados (objeto interno) , tenga en cuenta que elasticsearch tiene dos conceptos: objeto interno y objeto anidado.

Se puede encontrar una explicación detallada en la relación de manejo en elasticsearch.

Documento anidado Ejemplo

Entidad Persona:

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

Entidad del coche:

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

Configuración de datos:

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

Indexación:

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

Buscando:

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

Puede encontrar más casos de prueba sobre Objetos internos y anidados en Pruebas de objetos anidados