La segregación de responsabilidad de la consulta de comandos (CQRS) separa el comportamiento de modificar (comando, agregar, eliminar, modificar, modificar el estado del sistema) y consulta (consulta, consulta, no modificará el estado del sistema) del negocio. Esto deja la lógica más clara y facilita la optimización específica de diferentes partes.
CQRS tiene los siguientes puntos:
1. La división del trabajo es clara y puede ser responsable de diferentes partes;
2. Separar las responsabilidades de los comandos y consultas comerciales puede mejorar el rendimiento, la escalabilidad y la seguridad del sistema. Además, puede mantener un alto grado de flexibilidad en la evolución del sistema y evitar la aparición de cambios en una parte en la consulta o modificación en el modo CRUD, lo que resulta en problemas con la otra parte;
3. Lógica clara y puede ver que esos comportamientos u operaciones en el sistema han causado cambios en el estado del sistema;
4. Puede pasar de datos impulsados por datos a tareas y basadas en eventos.
Por lo tanto, el comando utiliza bases de datos, y la consulta utiliza ElasticSearch con una consulta más eficiente.
¿Cómo garantizar la consistencia entre la base de datos y los datos de Elasticsearch?
Podemos usar los datos de sincronización de eventos de dominio de Spring Data, consulte el artículo: http://www.vevb.com/article/135604.htm.
Cuando una base de datos anterior tiene una gran cantidad de datos que deben importarse a ElasticSearch, puede consultar el artículo: http://www.vevb.com/article/135426.htm
Spring Data Elasticsearch utiliza el cliente de transporte, mientras que el sitio web oficial de Elasticsearch recomienda usar REST Client. Todavía hay problemas con Elasticsearch de Alibaba Cloud usando Transport Client, y Alibaba Cloud recomienda usar REST Client.
Este ejemplo utiliza el enlace de Jest Spring Data Elasticsearch (actualmente solo admite Spring Boot2.0 o arriba). La versión de Elasticsearch es: 5.5.3
1. Construcción del proyecto
1. Las dependencias de la tarde son las siguientes:
<Spendency> <MoupRoD> com.github.vanroy </groupid> <artifactid> spring-boot-starter-data-jest </artifactid> <versión> 3.0.0.release </versión> </dependencia> <pendency> <proupid> io.searchbox </groupid> <artifactid> jest </artifactid> <versersion> 5.2.2.
2. Archivo de configuración
Spring: Data: Jest: Uri: http://127.0.0.1:9200 Nombre de usuario: contraseña elástica: Changeme
2. Construir condiciones de consulta
Tome una clase de entidad simple como ejemplo
paquete com.hfcsbc.esetl.domain; import lombok.data; import org.springframework.data.elasticsearch.annotations.document; import og.springframework.data.elasticsearch.annotations.field; import. javax.persistence.id; import javax.persistence.onetoone; import java.util.date; import java.util.list;/** * Create by Pengchao en 2018/2/23 */@document (indexName = "Person", tipo = "Persona", Shards = 1, ReflaCas = 0, FRESHINTVAL {@Id ID de largo privado; nombre de cadena privada; @Onetoone @field (type = fieldType.nested) Lista privada <dirección> dirección; número entero privado; estado entero privado; cumpleaños de fecha privada;} paquete com.hfcsbc.esetl.domain; import lombok.data; import javax.persistence.entity; import javax.persistence.id;/** * Create by Pengchao en 2018/2/23 */@Entity@dataPublic Class Dirección {@id privado ID largo; nombre de cadena privada; número entero privado;} 1. Consulta basada en múltiples estados (similar a SQL's IN)
Boolquiller orderStatUscondition = QueryBuilders.BoolQuery () .should (QueryBuilders.MermQuery ("Estado", 1)) .should (QueryBuilders.MermQuery ("Status", 2)) .Builders.MermQuery ("Estado", 3). .sha debería (QueryBuilders.terMQuery ("Estado", 5)); 2. y consulta de enlace (similar a SQL y)
BoolQueryBuilder QueryBuilder = QueryBuilders.BoolQuery (); QueryBuilder .Must (QueryBuilder1) .Must (QueryBuilder2) .Must (QueryBuilder3);
3. Consulta de range (similar a SQL entre .. y ..)
La copia del código es la siguiente:
QueryBuilder RangeQuery = QueryBuilders.RangeQuery ("cumpleaños"). De (ayer) .To (hoy);
4. Consulta de objetos anidados
La copia del código es la siguiente:
QueryBuilder QueryBuilder = QueryBuilders.NestedQuery ("Nested", QueryBuilders.MermQuery ("Dirección.id", 100001), ScorEmode.none);
ScorEmode: Define cómo se usa la puntuación en otro lado de unión. Si no presta atención a la puntuación, solo necesitamos configurarlo en scoremode.none. Este método ignorará la puntuación y, por lo tanto, será más eficiente y guardará la memoria.
3. Obtener estadísticas
1. Suma de datos sin anular
SumaggregationBuilder Sumbuilder = AggregationBuilders.sum ("Sum"). Field ("Número"); SearchQuery SearchQuery = New NatesearchQueryBuilder () .WithIndices (Query_index). AggregatedPage <ScacionOder> Account = (AggregatedPage <ScacetRorder>) EsparkingOrderRepository.Search (EsqueryBuilders.BuildyesterDayArRearsSumQuery (EmployeeId)); int sum = Account.getAgGregation ("Sum", Sumaggregation.Classs) .getSum (). IntValue (); 2. Suma de datos anidadas
SumaggregationBuilder Sumbuilder = AggregationBuilders.sum ("Sum"). Field ("adress.num"); AggregationBuilder AggregationBuilder = AggregationBuilders.Nested ("Nested", "Adress"). Subagregación (Sumbuilder); SearchQuery SearchQueryRyRery = New NativeSearcherering () .WithTypes (Query_Type) .WithQuery (boolQueryBuilder) .addaggregation ((AbstractAggregationBuilder) AggregationBuilder) .Build (); AggregatedPage <Scorector> Account = (AggregatedPage <Scabletorder>) EsparkingOrderRepository.search (EsqueryBuilders.BuildyesterDayArreRearsSumQuery (EmployeeId)); int Sum = Account.GetAgGregation ("Nested", Sumaggregation.Class) .GetAgGregation ("Sum", Sumaggregation.Class) .getSum (). intValue ();Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.