يفصل فصل مسؤولية استعلام الأوامر (CQRS) سلوك التعديل (الأمر ، إضافة ، حذف ، تعديل ، تعديل حالة النظام) والاستعلام (الاستعلام ، الاستعلام ، لن يعدل حالة النظام) عن العمل. هذا يجعل المنطق أكثر وضوحًا ويسهل التحسين المستهدف لأجزاء مختلفة.
CQRS لديها النقاط التالية:
1. تقسيم العمل واضح ويمكنك أن تكون مسؤولاً عن أجزاء مختلفة ؛
2. يمكن أن يؤدي فصل مسؤوليات أوامر العمل والاستعلامات إلى تحسين أداء النظام وقابليته للتوسع. بالإضافة إلى ذلك ، يمكن أن تحافظ على درجة عالية من المرونة في تطور النظام ، ومنع حدوث التغييرات في طرف واحد في الاستعلام أو التعديل في وضع Crud ، مما يؤدي إلى مشاكل مع الطرف الآخر ؛
3. منطق واضح ويمكن أن يرى أن تلك السلوكيات أو العمليات في النظام تسببت في تغييرات في حالة النظام ؛
4. يمكنك الانتقال من البيانات التي تعتمد على البيانات إلى المهام وتحركها الأحداث.
لذلك ، يستخدم الأوامر قواعد البيانات ، ويستخدم الاستعلام Elasticsearch مع استعلام أكثر كفاءة.
كيفية ضمان الاتساق بين قاعدة البيانات وبيانات Elasticsearch؟
يمكننا استخدام بيانات مزامنة الأحداث في مجال بيانات DIPRING ، يرجى الرجوع إلى المقالة: http://www.vevb.com/article/135604.htm.
عندما تحتوي قاعدة بيانات قديمة على كمية كبيرة من البيانات التي يجب استيرادها إلى Elasticsearch ، يمكنك الرجوع إلى المقالة: http://www.vevb.com/article/135426.htm
يستخدم Spring Data Elasticsearch عميل النقل ، بينما يوصي موقع Elasticsearch الرسمي باستخدام عميل REST. لا تزال هناك مشاكل مع Elasticsearch من Alibaba Cloud باستخدام عميل النقل ، وتوصي Alibaba Cloud باستخدام عميل REST.
يستخدم هذا المثال Spring Data Jest Link Elasticsearch (حاليًا يدعم فقط SPRING BOOT2.0 أو أعلى). إصدار Elasticsearch هو: 5.5.3
1. بناء المشروع
1. التبعيات التبعية هي كما يلي:
<Rependency> <roupeD> com.github.vanroy </rougiD> <StifactId> Spring-Boot-Starter-Data-Jest </shintifactid> <sored> 3.0.0.release </version> </redency> </dependency> <soperency>
2. ملف التكوين
الربيع: البيانات: Jest: URI: http://127.0.0.1:9200 اسم المستخدم: كلمة المرور المرنة: Changeme
2. بناء ظروف الاستعلام
خذ فئة كيان بسيطة كمثال
package 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/2/23 */@document (indexname = "person" ، type = "-1")@entity@datapublic person {id private long id ؛ اسم السلسلة الخاصة ؛ onetoOne@field (type = fieldtype.nested) قائمة خاصة <address> العنوان ؛ عدد عدد صحيح خاص ؛ حالة عدد صحيح خاص ؛ عيد ميلاد التاريخ الخاص ؛} package com.hfcsbc.esetl.domain ؛ استيراد lombok.data ؛ استيراد javax.persistence.entity ؛ استيراد javax.persistence.id ؛/** * إنشاء من قبل Pengchao في 2018/2/23 */intity@datapublic addrate {id private id ؛ اسم السلسلة الخاصة ؛ رقم عدد صحيح خاص ؛} 1. الاستعلام بناءً على حالات متعددة (على غرار SQL في)
Boolquiller OrderStatusCondition = QueryBuilders.Boolquery (). يجب أن يكون (QueryBuilders.TermQuery ("الحالة" ، 1)). يجب أن يكون (QueryBuilders.TermQuer ("status" ، 2)). يجب أن يكون (QueryBuilders.TermQuery ("الحالة" ، 5)) ؛ 2. و Rink Query (على غرار SQL و)
boolquerybuilder querybuilder = querybuilders.boolquery () ؛ QueryBuilder .Must (QueryBuilder1) .Must (QueryBuilder2) .Must (QueryBuilder3) ؛
3. استعلام Range (على غرار SQL بين .. و ..)
نسخة الكود كما يلي:
QueryBuilder RangeQuery = QueryBuilders.RangeQuery ("عيد ميلاد"). من (أمس). إلى (اليوم) ؛
4. استعلام الأشياء المتداخلة
نسخة الكود كما يلي:
QueryBuilder QueryBuilder = QueryBuilders.nestedQuery ("nested" ، QueryBuilders.TermQuery ("address.id" ، 100001) ، scoremode.none) ؛
Scoremode: يحدد كيفية استخدام النتيجة في جانب الانضمام الآخر. إذا لم تنتبه إلى التسجيل ، فنحن بحاجة فقط إلى ضبطه على Scoremode.none. ستتجاهل هذه الطريقة النتيجة ، وبالتالي ستكون أكثر كفاءة وتوفير الذاكرة
3. الحصول على الإحصاءات
1. مجموع البيانات غير المقيدة
sumAggRegationBuilder sumbuilder = aggregationBuilders.sum ("sum"). الحقل ("رقم") .edaggergation (sumbuilder) .build () ؛ aggregatedpage <Cropearorder> حساب = (pagepage <SparetorDer>) EsparkingOrderRepository.Search (EsqueryBuilders.BuildyesterDayArrearsSumquery (effereneiD)) ؛ int sum = account.getaggregation ("sum" ، sumaggregation.class). 2. مجموع البيانات المتداخلة
sumAggRegationBuilder sumbuilder = AggregationBuilders.sum ("sum"). الحقل ("adress.num") ؛ AggregationBuilder AggregationBuilder = AggregationBuilders.nested ("nester" ، "adress"). . esparkingOrderRepository.Search (EsqueryBuilders.BuildyesterDayArrearsSumquery (effecteeid)) ؛ int sum = account.getaggergation ("nested" ، sumaggregation.class).ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.