Командный запрос Ответственный сегрегация (CQRS) разделяет поведение изменения (командования, добавления, удаления, изменения, изменения состояния системы) и запроса (запрос, запрос, не будет изменять статус системы) из бизнеса. Это делает логику более четкой и облегчает целевую оптимизацию различных частей.
CQRS имеет следующие моменты:
1. Разделение труда ясно, и вы можете нести ответственность за различные части;
2. Разделение обязанностей бизнес -команд и запросов может улучшить производительность, масштабируемость и безопасность системы. Кроме того, он может поддерживать высокую степень гибкости в эволюции системы и предотвратить возникновение изменений в одной стороне в запросе или модификации в режиме CRUD, что приводит к проблемам с другой стороной;
3. Очищенная логика и может видеть, что эти поведения или операции в системе вызвали изменения в состоянии системы;
4. Вы можете перейти от управляемого данными к управляемым задачам и управляемым событиями.
Поэтому команда использует базы данных, а запрос использует Elasticsearch с более эффективным запросом.
Как обеспечить согласованность между данными базы данных и Elasticsearch?
Мы можем использовать данные о событиях, то есть данные синхронизации событий домена Spring Data, пожалуйста, обратитесь к статье: http://www.vevb.com/article/135604.htm.
Когда старая база данных имеет большое количество данных, которые необходимо импортировать в Elasticsearch, вы можете обратиться к статье: http://www.vevb.com/article/135426.htm
Spring Data Elasticsearch использует транспортный клиент, в то время как официальный веб -сайт Elasticsearch рекомендует использовать клиент REST. У Elasticsearch Alasticsearch Alasticsearch Alibaba Cloud с использованием транспортного клиента, и Alibaba Cloud рекомендует использовать клиент REST.
В этом примере используется Spring Data Jest Link Elasticsearch (в настоящее время поддерживает только Spring Boot2.0 или выше). Версия Elasticsearch: 5.5.3
1. Строительство проекта
1. Положение зависимостей следующим образом:
<dependency> <groupId>com.github.vanroy</groupId> <artifactId>spring-boot-starter-data-jest</artifactId> <version>3.0.0.RELEASE</version></dependency><dependency> <groupId>io.searchbox</groupId> <artifactId>jest</artifactId> <version>5.3.2</version></dependency>
2. Файл конфигурации
Весна: Данные: Jest: URI: http://127.0.0.1:9200 Имя пользователя: Эластичный пароль: Changeme
2. Строительными условиями запроса
Возьмите простой класс сущностей в качестве примера
пакет com.hfcsbc.esetl.domain; import lombok.data; import org.springframework.data.elasticsearch.annotations.document; импорт org.springframework.data.elasticsearch.annotations.field; import org.spramework.data.elasticsearch.annotations. javax.persistence.entity; импорт javax.persistence.id; импорт javax.persistence.onetoone; импорт java.util.date; импорт java.util.list;/** * Создать Pengchao на 2018/2/23 */@документ (indexname = ", тип =", ", Shards = 1, replyse? "-1")@Entity@DataPublic Class Person {@ID Private Long ID; Приватное название строки; @Onetoone @field (type = fieldtype.nested) частный список <drade> Адрес; частное целое число; частное целое число; частное свидание по случаю дня рождения;} пакет com.hfcsbc.esetl.domain; import lombok.data; import javax.persistence.entity; import javax.persistence.id;/** * Создание Pengchao на 2018/2/23 */@entity@DataPublic Class Адрес {@ID Private Long ID; Приватное название строки; частное целое число;} 1. Запрос на основе нескольких состояний (аналогично SQL в)
Boolquiller orderstatuscondition = QueryBuilders.boolquery (). Should (QueryBuilders.Termquery («Статус», 1)). Можно (QueryBuilders.termquery («Статус», 2). . должен (QueryBuilders.termercquery («Статус», 5));
2. и запрос ссылки (аналогично SQL и)
BoolqueryBuilder QueryBuilder = QueryBuilders.Boolquery (); QueryBuilder .must (QueryBuilder1) .must (QueryBuilder2) .must (QueryBuilder3);
3. Рейндж (похожий на SQL между .. и ..)
Кода -копия выглядит следующим образом:
QueryBuilder rangeQuery = QueryBuilders.rangeQuery ("День рождения"). От (вчера). До (сегодня);
4. Вложенный объектный запрос
Кода -копия выглядит следующим образом:
QueryBuilder QueryBuilder = QueryBuilders.nestedQuery ("indest", QueryBuilders.Termquery ("address.id", 100001), scoremode.none);
ScoreMode: определяет, как балл используется в другой стороне соединения. Если вы не обращаете внимания на оценку, нам просто нужно установить его на ScoreMode.none. Этот метод будет игнорировать оценку и, следовательно, будет более эффективным и сохранить память
3. Получить статистику
1. Незначная сумма данных
SumaggregationBuilder sumbuilder = AggregationBuilders.sum ("sum"). Field ("number"); Searchquery searchquery = new ContivessearchQueryBuilder (). Withindices (Query_index). Withtypes (Query_type) .withquery (boolquerybuilder). Агрегированная плита <parkingord> account = (агрегированная плата <parkingorder>) esparkingorderrepository.search (esquerybuilders.buildyestdayarearearssumquery (employeeid)); ut sum = account.getaggregation («sum», sumaggregation.class) .getsum (). 2. Вложенная сумма данных
SumaggregationBuilder Sumbuilder = AggregationBuilders.sum («sum»). Field («Adress.num»); AggregationBuilder AggregationBuilder = AggregationBuilders.nested («Inted», «Adressebration»). Subagegration (Sumbuilder); . Withindices (Query_index). Withtypes (Query_type). Withquery (BoolqueryBuilder). Аддаггрегация ((AbstractaggregationBuilder). esparkingorderrepository.search (esquerybuilders.buildyestdayArgearssumquery (employeeid)); int sum = account.getaggreation («вложенная», sumaggreation.class) .getaggregation («sum», sumaggregation.class) .getsum (). Intvalue ();
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.