コマンドクエリ責任分離(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の公式WebサイトはRESTクライアントの使用をお勧めします。 Alibaba CloudのElasticsearch Transport Clientを使用してまだ問題があり、Alibaba CloudはRESTクライアントを使用することをお勧めします。
この例では、Spring Data Jest Link Elasticsearchを使用しています(現在、Spring Boot2.0以上のみをサポートしています)。 ElasticSearchのバージョンは5.5.3です
1。プロジェクト構築
1.POM依存関係は次のとおりです。
<依存関係> groupId> com.github.vanroy </groupid> <artifactid> spring-boot-starter-data-jest </artifactid> <バージョン> 3.0.0.release </version </version> <deplency> <deplagency> <groupid> io.searchbox </groupid> jest> </> </> </>> </> </> </> </> </> </> </> </birgen
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; import org.springframework.data.elasticsearch.annotations.field; Import org.springframework.data.elasticseartations. javax.persistence.entity; import javax.persistence.id; import javax.persistence.onetoone; Import java.util.date; Import java.util.list;/** * create by pengchao by pengchao by Pengchao by Pengchao by 2018/23 */@@document = "Person ="、type = "、shards =" "-1")@entity@datapublic class person {@id private long id;プライベート文字列名; @onetoone @field(type = fieldtype.nested)プライベートリスト<アドレス>アドレス;プライベート整数番号。プライベート整数ステータス。プライベートデートの誕生日;}パッケージcom.hfcsbc.esetl.domain; import lombok.data; import javax.persistence.entity; import javax.persistence.id;/** * create by pengchao by pengchao by pengchao by@@entity@datapublic classアドレス{@id private long id;プライベート文字列名;プライベート整数番号;} 1。複数の状態に基づくクエリ(SQLのINに類似)
boolquiller orderstatuscondition = querybuilders.boolquery().should(querybuilders.termquery( "status"、1))。 。
2.そしてリンククエリ(SQLと同様)
boolquerybuilder querybuilder = querybuilders.boolquery(); querybuilder .must(querybuilder1).must(querybuilder2).must(querybuilder3);
3.クエリを削減します(..と..の間のSQLに似ています)
コードコピーは次のとおりです。
querybuilder rangequery = querybuilders.rangequery( "Birthday")。
4。ネストされたオブジェクトクエリ
コードコピーは次のとおりです。
querybuilder querybuilder = querybuilders.nestedquery( "nested"、querybuilders.termquery( "address.id"、100001)、scoremode.none);
スコアモード:他の結合側でスコアがどのように使用されるかを定義します。スコアリングに注意を払わない場合は、ScoreMode.noneに設定するだけです。この方法はスコアを無視するため、より効率的でメモリを保存します
3.統計を取得します
1。未成年のデータサム
sumaggregationBuilder sumbuilder = aggregationBuilders.sum( "sum")。field( "number"); searchQuery searchquery = new nativesearchquerybuilder().withindices(query_index).witthtypes(query_type).withquery(boolquerybuilder) .Addaggregation(sumbuilder).build(); aggregatedpage <parkingorder> account =(aggregatedpage <parkingorder>)esparkingOrderRepository.search(esquerybuilders.buildyesterdayarrearssumquery(employeed)); int sum = counceggregation( "sum"、sumaggregation.class).getusum()。
2。ネストされたデータサム
sumaggregationBuilder sumbuilder = aggregationBuilders.sum( "sum")。field( "adress.num"); aggregationbuilderbuilder = aggregationbuilders.nested( "nested"、 "adress")。 .withindices(query_index).withtypes(query_type).withquery(boolquerybuilder).addaggregation((abstractaggregationbuilder)aggregationbuilder).build(); aggregatedpage <parking> councount =(aggregatedpagepagepage <barkingord>) esparkingOrderRepository.Search(eSqueryBuilders.BuildyEsterDayArrearsSumquery(EmployeeD)); int sum = account.getaggregation( "nested"、sumaggregation.class).getaggregation( "sum"、sumaggregation.class).getumun()。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。