คำสั่งการสืบค้นความรับผิดชอบการแยก (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 Client ยังคงมีปัญหากับ Elasticsearch ของ Alibaba Cloud โดยใช้ไคลเอนต์การขนส่งและ Alibaba Cloud แนะนำให้ใช้ REST Client
ตัวอย่างนี้ใช้สปริงข้อมูล jest elasticsearch (ปัจจุบันรองรับ Spring Boot2.0 หรือสูงกว่าเท่านั้น) เวอร์ชันของ Elasticsearch คือ: 5.5.3
1. การก่อสร้างโครงการ
1. การพึ่งพามีดังนี้:
<การพึ่งพา> <roupId> com.github.vanroy </groupId> <ratifactid> Spring-Boot-Starter-Data-Jest </artifactid> <sersion> 3.0.0.Release </เวอร์ชัน> </การพึ่งพา>
2. ไฟล์กำหนดค่า
ฤดูใบไม้ผลิ: ข้อมูล: jest: uri: http://127.0.0.1:9200 ชื่อผู้ใช้: รหัสผ่านยืดหยุ่น: Changeme
2. สร้างเงื่อนไขการสอบถาม
ใช้คลาสเอนทิตีง่าย ๆ เป็นตัวอย่าง
แพ็คเกจ com.hfcsbc.esetl.domain; นำเข้า lombok.data; นำเข้า org.springframework.data.elasticsearch.annotations.document; นำเข้า org.springframework.data.elasticsearch.annotations.field; javax.persistence.entity; นำเข้า Javax.persistence.id; นำเข้า Javax.persistence.onetoone; นำเข้า java.util.date นำเข้า java.util.list;/** * สร้างโดย Pengchao เมื่อปี 2018/23 "-1")@entity@datapublic คลาสคลาส {@id ส่วนตัว @id ส่วนตัว id; ชื่อสตริงส่วนตัว; @onetoone @field (type = fieldtype.nested) รายการส่วนตัว <dront> ที่อยู่; หมายเลขจำนวนเต็มส่วนตัว สถานะจำนวนเต็มส่วนตัว วันเกิดส่วนตัววันเกิด;}แพ็คเกจ com.hfcsbc.esetl.domain; นำเข้า lombok.data; นำเข้า javax.persistence.entity; นำเข้า Javax.persistence.id;/** * สร้างโดย Pengchao เมื่อปี 2018/2/23 */@entity@datapublic enter ชื่อสตริงส่วนตัว; หมายเลขจำนวนเต็มส่วนตัว;}
1. แบบสอบถามขึ้นอยู่กับหลายรัฐ (คล้ายกับ SQL's In)
boolquiller orderstatuscondition = querybuilders.boolQuery (). ควร (querybuilders.termquery ("สถานะ", 1)). ควร (querybuilders.termquery ("สถานะ", 2)) . ควร (querybuilders.termQuery ("สถานะ", 5)); 2. และค้นหาลิงค์ (คล้ายกับ SQL และ)
boolQueryBuilder queryBuilder = queryBuilders.boolQuery (); queryBuilder .must (queryBuilder1) .must (queryBuilder2) .must (queryBuilder3);
3.Range Query (คล้ายกับ SQL ระหว่าง .. และ .. )
การคัดลอกรหัสมีดังนี้:
QueryBuilder rangeQuery = queryBuilders.RangeQuery ("วันเกิด") จาก (เมื่อวาน). ถึง (วันนี้);
4. คำถามที่ซ้อนกัน
การคัดลอกรหัสมีดังนี้:
queryBuilder queryBuilder = queryBuilders.nestedQuery ("ซ้อน", queryBuilders.termQuery ("address.id", 10001), scoremode.none);
Scoremode: กำหนดวิธีการใช้คะแนนในด้านเข้าร่วมอื่น ๆ หากคุณไม่ใส่ใจกับการให้คะแนนเราเพียงแค่ต้องตั้งค่าเป็น scoremode ไม่มี วิธีนี้จะเพิกเฉยต่อคะแนนและจะมีประสิทธิภาพมากขึ้นและบันทึกหน่วยความจำ
3. รับสถิติ
1. ผลรวมข้อมูลที่ไม่ได้รับการขาน
sumaggregationBuilder sumbuilder = aggregationBuilders.sum ("sum"). ฟิลด์ ("number"); searchQuery searchQuery = nativesearchQueryBuilder (). withIndices (query_index). withTtypes (query_type) AggregatedPage <Parkingorder> บัญชี = (AggregatedPage <Parkingorder>) EsparkingOrderRepository.Search (ESQUERYBUILDERS.BUILDYESTERESTERARREARSSUMQUERY (EmployeeId)); int sum = account.getAggregation ( 2. ผลรวมข้อมูลซ้อนกัน
sumaggregationBuilder sumbuilder = aggregationBuilders.sum ("sum"). ฟิลด์ ("adress.num"); AggregationBuilder AggregationBuilder = AggregationBuilders.nested ("Nested", "adress"). subaggregation (sumbuilder) .WithIndices (query_index) .withtypes (query_type). withQuery (boolquerybuilder) .addaggregation ((AbstractaggregregationBuilder) AggregationBuilder) .build (); AggregatedPage <ที่จอดรถ> บัญชี = EsparkingOrderRepository.Search (EsqueryBuilders.BuildyesterDayArrearsSumQuery (EmployeeId)); int sum = account.getAggregation ("ซ้อน", sumaggregation.class) .getaggregation ("ผลรวม"ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น