A segregação de responsabilidade da consulta de comando (CQRS) separa o comportamento de modificar (comando, add, excluir, modificar, modificar o status do sistema) e consultar (consulta, consulta, não modificará o status do sistema) da empresa. Isso torna a lógica mais clara e facilita a otimização direcionada de diferentes partes.
CQRS tem os seguintes pontos:
1. A divisão do trabalho é clara e você pode ser responsável por diferentes partes;
2. A separação das responsabilidades dos comandos e consultas de negócios pode melhorar o desempenho, a escalabilidade e a segurança do sistema. Além disso, pode manter um alto grau de flexibilidade na evolução do sistema e impedir a ocorrência de alterações em uma parte na consulta ou modificação no modo CRUD, resultando em problemas com a outra parte;
3. Lógica limpa e pode ver que esses comportamentos ou operações no sistema causaram alterações no estado do sistema;
4. Você pode ir de dados orientados a dados e orientados a tarefas e orientados por eventos.
Portanto, o comando usa bancos de dados e consulta usa o Elasticsearch com consulta mais eficiente.
Como garantir a consistência entre os dados do banco de dados e do Elasticsearch?
Podemos usar os dados de sincronização de eventos de domínio do Spring Data Data, consulte o artigo: http://www.vevb.com/article/135604.htm.
Quando um banco de dados antigo tem uma grande quantidade de dados que precisam ser importados para o Elasticsearch, você pode consultar o artigo: http://www.vevb.com/article/135426.htm
Spring Data Elasticsearch usa o Transport Client, enquanto o site oficial da Elasticsearch recomenda o uso do Rest Client. Ainda existem problemas com o ElasticSearch da Alibaba Cloud usando o Transport Client, e o Alibaba Cloud recomenda o uso do Rest Client.
Este exemplo usa o link JEST do Spring Data JEST Elasticsearch (atualmente suporta apenas o Spring Boot2.0 ou acima). A versão do Elasticsearch é: 5.5.3
1. Construção do projeto
1. As dependências do POM são as seguintes:
<Depencency> <PuerpId> com.github.vanroy </groupiD> <TRATIFACTID> Spring-boot-starter-data-jest </artifactId> <versão> 3.0.0.release </version> </dependency> jestency> <puperid> io.searchbox </groupid> <sterfactid>
2. Arquivo de configuração
Primavera: Dados: JEST: URI: http://127.0.0.1:9200 Nome de usuário: senha elástica: ChangeMe
2. Construa condições de consulta
Tome uma aula de entidade simples como exemplo
pacote com.hfcsbc.esetl.Domain; importar lombok.data; importar org.springframework.data.elticsearch.annotações.document; importar org.springframework.data.elticsearch.annotations.field; importação.sPringFramework.data.elticsearch.annotations; importação; javax.persistence.Entity; importar javax.persistence.id; importar javax.persistence.onetoOne; importar java.util.date; importar java.util.list;/** * Criar por Pengchao em 2018/2/23 */@document (indexname = "" "-1")@entity@datapublic classe pessoa {@id private longo id; nome de string privado; @Onetoone @field (type = fieldtype.nested) Lista privada <endereço> endereço; número inteiro privado; status inteiro privado; aniversário privado aniversário;} pacote com.hfcsbc.esetl.Domain; importar lombok.data; importar javax.persistence.entity; importar javax.persistence.id;/** * Criar por Pengchao em 2018/2/23 */@entity@Datapublic Endereço {@id Long id; nome de string privado; número inteiro privado;} 1. Consulta baseada em vários estados (semelhante ao SQL's in)
Boolquiller orderstatuscondition = QueryBuilders.BoolQuery () .Would (querybuilders.termQuery ("status", 1)). .Would (querybuilders.termQuery ("status", 5)); 2.e consulta de link (semelhante ao SQL e)
BoolQueryBuilder QueryBuilder = QueryBuilders.BoolQuery (); QueryBuilder .Must (QueryBuilder1) .Must (QueryBuilder2) .Must (QueryBuilder3);
3.Range Query (semelhante ao SQL entre .. e ..)
A cópia do código é a seguinte:
QueryBuilder rangeQuery = QueryBuilders.RangeQuery ("Aniversário"). De (ontem) .to (hoje);
4. Consulta de objeto aninhado
A cópia do código é a seguinte:
QueryBuilder querybuilder = querybuilders.nestedQuery ("aninhado", querybuilders.termQuery ("endereço.id", 100001), scoremode.none);
Scoremode: define como a pontuação é usada em outro lado de junção. Se você não prestar atenção à pontuação, precisamos defini -la como scoremode.NONE. Este método ignorará a pontuação e, portanto, será mais eficiente e salvará a memória
3. Obtenha estatísticas
1.
SumagregationBuilder Sumbuilder = AgregationBuilders.sum ("Sum"). Field ("Número"); SearchQuery SearchQuery = new NativearchQueryBuilder () .Withindices (Query_index) .WithTypes (Query_type) .WithQuery (BoLQueryBuilder) .AddDagger (Query_type). AGGREDATEDPAGE <TalkingOrder> Account = (AgregedPage <TalkingOder>) EsparkingOrderRepository.Search (EsqueryBuilders.buildyesterdayArraRarSsumQuery (EmployeeID)); int sum = conta. 2. Soma de dados aninhados
SumagregationBuilder sumbuilder = agregationBuilders.sum ("Sum"). Field ("endereço.num"); agregationbuilder agregationbuilder = agregationbuilders.nested ("aninhado", "adress"). .WITHTYPES (Query_type) .WithQuery (BoolQueryBuilder) .Addagregation (((AbstractAgregationBuilder) AgregationBuilder) .build (); agregatedpage <CoundicorOrder> Conta = (agregatedpage <Talkingorder>) esparkingorderrepository.search (squerybuilders.buildyesterdayArlaRarSsumQuery (funcionárioID)); int sum = account.getAggregation ("aninhado", sumaggregation.class) .getAgregation ("sum", sumaggregation.class) .getSum ().O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.