激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

服務器之家 - 編程語言 - Java教程 - 基于Spring Data Jest的Elasticsearch數(shù)據(jù)統(tǒng)計示例

基于Spring Data Jest的Elasticsearch數(shù)據(jù)統(tǒng)計示例

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

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

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

CQRS有以下幾點有點:

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

如何確保數(shù)據(jù)庫和Elasticsearch的數(shù)據(jù)的一致性?

我們可以使用事件驅動(Event-Driven)即Spring Data的Domain Event同步數(shù)據(jù),可參考文章:http://www.zmynmublwnt.cn/article/154225.html 。

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

Spring Data Elasticsearch使用的是transport client,而Elasticsearch官網(wǎng)推薦使用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.根據(jù)多個狀態(tài)查詢(類似于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,此種方式會忽略評分因此會更高效和節(jié)約內存

3.獲取統(tǒng)計數(shù)據(jù)

1.非嵌套獲取數(shù)據(jù)求和

?
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.嵌套數(shù)據(jù)求和

?
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/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品v片在线观看不卡 国产另类一区 | 日韩视频区| 91美女福利视频 | 久久精品无码一区二区三区 | 成人三级电影网址 | 日本黄色大片免费 | 色婷婷综合久久久中字幕精品久久 | 草莓视频久久 | 欧美日性 | 91超在线 | 国产在线观看 | 日韩在线播放第一页 | 中文字幕电影免费播放 | 日日草夜夜 | 国产一区网址 | 国产一区精品视频 | 日本成年网 | 鲁丝片一区二区三区免费入口 | 国产精品一区二区免费在线观看 | 国产妇女乱码一区二区三区 | jizzzzxxxxx | 欧美日韩电影在线 | 免费在线观看毛片 | 91 免费视频| 国产成人高潮免费观看精品 | 免费观看黄视频 | 91精品国产毛片 | 亚洲综合无码一区二区 | 激情视频在线播放 | 美女黄页网站免费进入 | 热99在线视频 | 在线看一级片 | 日本看片一区二区三区高清 | 午夜爽爽爽男女免费观看hd | 黄视频网站免费观看 | 欧美日韩亚洲成人 | 国产1区2区在线 | 国产一级做a爰片在线看 | 久草在线新时代视觉 | 成人aaaa免费全部观看 | 欧美老外a级毛片 |