91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于Spring Data Jest的Elasticsearch數據統計示例

發布時間:2020-09-25 06:42:16 來源:腳本之家 閱讀:331 作者:汪云飛記錄本 欄目:編程語言

命令查詢職責分離模式(Command Query Responsibility Segregation,CQRS)從業務上分離修改 (Command,增,刪,改,會對系統狀態進行修改)和查詢(Query,查,不會對系統狀態進行修改)的行為。從而使得邏輯更加清晰,便于對不同部分進行針對性的優化。

CQRS有以下幾點有點:

1.分工明確,可以負責不同的部分;
2.將業務上的命令和查詢的職責分離能夠提高系統的性能、可擴展性和安全性。并且在系統的演化中能夠保持高度的靈活性,能夠防止出現CRUD模式中,對查詢或者修改中的某一方進行改動,導致另一方出現問題的情況;
3.邏輯清晰,能夠看到系統中的那些行為或者操作導致了系統的狀態變化;
4.可以從數據驅動(Data-Driven) 轉到任務驅動(Task-Driven)以及事件驅動(Event-Driven)。
因此Command使用數據庫,Query使用效率查詢效率更高的Elasticsearch。

如何確保數據庫和Elasticsearch的數據的一致性?

我們可以使用事件驅動(Event-Driven)即Spring Data的Domain Event同步數據,可參考文章:https://www.jb51.net/article/135604.htm 。

當老數據庫有大量數據需要導入Elasticsearch時,可參考文章:https://www.jb51.net/article/135426.htm

Spring Data Elasticsearch使用的是transport client,而Elasticsearch官網推薦使用REST client。阿里云的Elasticsearch使用transport client目前還在存在問題,阿里云推薦使用REST client。

本示例使用的是Spring Data Jest鏈接Elasticsearch(目前只有spring boot2.0以上版本支持),Elasticsearch的版本為:5.5.3

1.項目構建

1.pom依賴如下:

<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.配置文件

spring:
 data:
  jest:
   uri: http://127.0.0.1:9200
   username: elastic
   password: changeme

2.構造查詢條件

以簡單的實體類為例

package 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.elasticsearch.annotations.FieldType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import java.util.Date;
import java.util.List;

/**
 * Create by pengchao on 2018/2/23
 */
@Document(indexName = "person", type = "person", shards = 1, replicas = 0, refreshInterval = "-1")
@Entity
@Data
public class Person {
  @Id
  private Long id;
  private String name;
  @OneToOne
  @Field(type = FieldType.Nested)
  private List<Address> address;
  private Integer number;
  private Integer status;
  private Date birthDay;
}
package com.hfcsbc.esetl.domain;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Id;

/**
 * Create by pengchao on 2018/2/23
 */
@Entity
@Data
public class Address {
  @Id
  private Long id;
  private String name;
  private Integer number;
}

1.根據多個狀態查詢(類似于sql的in)

BoolQueryBuilder orderStatusCondition = QueryBuilders.boolQuery()
    .should(QueryBuilders.termQuery("status", 1))
    .should(QueryBuilders.termQuery("status", 2))
    .should(QueryBuilders.termQuery("status", 3))
    .should(QueryBuilders.termQuery("status", 4))
    .should(QueryBuilders.termQuery("status", 5));

2.and鏈接查詢(類似于sql的and)

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder
    .must(queryBuilder1)
    .must(queryBuilder2)
    .must(queryBuilder3);

3.range查詢(類似于sql的between .. and ..)

復制代碼 代碼如下:

QueryBuilder rangeQuery = QueryBuilders.rangeQuery("birthDay").from(yesterday).to(today);

4.嵌套對象查詢

復制代碼 代碼如下:

QueryBuilder queryBuilder = QueryBuilders.nestedQuery("nested", QueryBuilders.termQuery("address.id", 100001), ScoreMode.None);

ScoreMode: 定義other join side中score是如何被使用的。如果不關注scoring,我們只需要設置成ScoreMode.None,此種方式會忽略評分因此會更高效和節約內存

3.獲取統計數據

1.非嵌套獲取數據求和

SumAggregationBuilder sumBuilder = AggregationBuilders.sum("sum").field("number");
SearchQuery searchQuery = new NativeSearchQueryBuilder()
    .withIndices(QUERY_INDEX)
    .withTypes(QUERY_TYPE)
    .withQuery(boolQueryBuilder)
    .addAggregation(sumBuilder).build();
    
AggregatedPage<ParkingOrder> account = (AggregatedPage<ParkingOrder>) esParkingOrderRepository.search(EsQueryBuilders.buildYesterdayArrearsSumQuery(employeeId));

int sum = account.getAggregation("sum", SumAggregation.class).getSum().intValue();

2.嵌套數據求和

SumAggregationBuilder sumBuilder = AggregationBuilders.sum("sum").field("adress.num");
AggregationBuilder aggregationBuilder = AggregationBuilders.nested("nested", "adress").subAggregation(sumBuilder);
SearchQuery searchQuery = new NativeSearchQueryBuilder()
    .withIndices(QUERY_INDEX)
    .withTypes(QUERY_TYPE)
    .withQuery(boolQueryBuilder)
    .addAggregation((AbstractAggregationBuilder) aggregationBuilder).build();
AggregatedPage<ParkingOrder> account = (AggregatedPage<ParkingOrder>) esParkingOrderRepository.search(EsQueryBuilders.buildYesterdayArrearsSumQuery(employeeId));
int sum = account.getAggregation("nested", SumAggregation.class).getAggregation("sum", SumAggregation.class).getSum().intValue();

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

台州市| 邢台县| 五莲县| 常德市| 玉环县| 西宁市| 蕉岭县| 郯城县| 区。| 鞍山市| 双柏县| 霍林郭勒市| 新野县| 塔城市| 阿拉善盟| 长沙市| 普定县| 海晏县| 泽州县| 巢湖市| 苍山县| 鱼台县| 台中县| 武山县| 江孜县| 靖西县| 汶上县| 唐海县| 工布江达县| 商洛市| 连云港市| 安泽县| 巴东县| 朝阳市| 普格县| 磐安县| 阿勒泰市| 寿光市| 宽甸| 兴城市| 邵阳县|