国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 基于Spring Data Jest的Elasticsearch數據統計示例

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

2021-04-08 14:11汪云飛記錄本 Java教程

本篇文章主要介紹了基于Spring Data Jest的Elasticsearch數據統計示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

命令查詢職責分離模式(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同步數據,可參考文章:http://www.jfrwli.cn/article/154225.html 。

當老數據庫有大量數據需要導入Elasticsearch時,可參考文章:http://www.jfrwli.cn/article/153563.html

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依賴如下:

?
1
2
3
4
5
6
7
8
9
10
11
<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.配置文件

?
1
2
3
4
5
6
spring:
 data:
  jest:
   uri: http://127.0.0.1:9200
   username: elastic
   password: changeme

2.構造查詢條件

以簡單的實體類為例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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;
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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)

?
1
2
3
4
5
6
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)

?
1
2
3
4
5
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.非嵌套獲取數據求和

?
1
2
3
4
5
6
7
8
9
10
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.嵌套數據求和

?
1
2
3
4
5
6
7
8
9
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();

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

原文鏈接:http://www.wisely.top/2018/02/27/spring-data-jest-elasticsarch/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品国产乱码久久久久久久软件 | 午夜影院在线 | 中文字幕欧美激情 | 免费看一区二区三区 | 成人aaaa免费全部观看 | 卡通动漫第一页 | 国产一区二区精品在线观看 | 在线成人av| 亚洲精品一二区 | 久久久午夜爽爽一区二区三区三州 | 成人亚洲视频 | 久久一区视频 | 亚洲精品三级 | 国产成人视屏 | 国产999精品久久久久久麻豆 | 亚洲福利国产 | 波多野吉衣网站 | 黄色网页免费看 | 亚洲欧美在线精品 | 久久久久久久久久久九 | 久久9色| 日韩精品一区二区三区在线观看 | 欧美激情视频一区二区三区不卡 | 免费av在线播放 | 免费的av网站 | 99久久精品国产毛片 | 久久作爱视频 | av在线干 | 国产免费自拍 | 免费黄色在线观看视频 | 午夜黄色影院 | 中文字幕在线观看 | 国产精品网站在线看 | 起碰在线视频 | 一久久久 | 91高清视频在线观看 | 夜夜夜久久久 | 亚洲精品日本 | 日韩在线一区二区三区 | 国产色秀视频在线观看 | 国产日产精品一区二区三区四区 |