最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年02月28日 09:21:56   作者:汪云飛記錄本  
本篇文章主要介紹了基于Spring Data Jest的Elasticsearch數(shù)據(jù)統(tǒng)計示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

CQRS有以下幾點有點:

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

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

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

當老數(shù)據(jù)庫有大量數(shù)據(jù)需要導(dǎo)入Elasticsearch時,可參考文章:http://www.fzitv.net/article/135426.htm

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.項目構(gòu)建

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.構(gòu)造查詢條件

以簡單的實體類為例

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.根據(jù)多個狀態(tài)查詢(類似于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 ..)

復(fù)制代碼 代碼如下:

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

4.嵌套對象查詢

復(fù)制代碼 代碼如下:

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

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

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

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

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ù)求和

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();

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中File與byte[]的互轉(zhuǎn)方式

    Java中File與byte[]的互轉(zhuǎn)方式

    這篇文章主要介紹了Java中File與byte[]的互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Springboot使用@WebListener?作為web監(jiān)聽器的過程解析

    Springboot使用@WebListener?作為web監(jiān)聽器的過程解析

    這篇文章主要介紹了Springboot使用@WebListener作為web監(jiān)聽器的過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 簡單談?wù)凧ava類與類之間的關(guān)系

    簡單談?wù)凧ava類與類之間的關(guān)系

    類與類之間的關(guān)系對于理解面向?qū)ο缶哂泻苤匾淖饔?,以前在面試的時候也經(jīng)常被問到這個問題,在這里我就簡單給大家介紹一下。
    2016-05-05
  • Idea如何使用System.getenv()獲取環(huán)境變量的值

    Idea如何使用System.getenv()獲取環(huán)境變量的值

    文章介紹了如何在Java中使用`System.getenv()`方法讀取環(huán)境變量的值,并提供了兩種配置環(huán)境變量的方法:啟動項配置和系統(tǒng)環(huán)境變量配置,對于系統(tǒng)環(huán)境變量,文章特別指出需要重啟電腦或程序才能使其生效
    2024-11-11
  • myeclipse創(chuàng)建servlet_動力節(jié)點Java學院整理

    myeclipse創(chuàng)建servlet_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了myeclipse創(chuàng)建servlet的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java中SimpleDateFormat的使用方法

    Java中SimpleDateFormat的使用方法

    這篇文章主要為大家詳細介紹了Java中SimpleDateFormat的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 圖解二叉樹的三種遍歷方式及java實現(xiàn)代碼

    圖解二叉樹的三種遍歷方式及java實現(xiàn)代碼

    本篇文章主要介紹了圖解二叉樹的三種遍歷方式及java實現(xiàn)代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • java 線性表接口的實例詳解

    java 線性表接口的實例詳解

    這篇文章主要介紹了java 線性表接口的實現(xiàn)實例詳解的相關(guān)資料,希望通過本能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Spring中的@EnableScheduling定時任務(wù)注解

    Spring中的@EnableScheduling定時任務(wù)注解

    這篇文章主要介紹了Spring中的@EnableScheduling注解,@EnableScheduling是 Spring Framework 提供的一個注解,用于啟用 Spring 的定時任務(wù)功能,通過使用這個注解,可以在 Spring 應(yīng)用程序中創(chuàng)建定時任務(wù),需要的朋友可以參考下
    2024-01-01
  • SpringBoot QQ郵箱發(fā)送郵件實例代碼

    SpringBoot QQ郵箱發(fā)送郵件實例代碼

    大家好,本篇文章主要講的是SpringBoot QQ郵箱發(fā)送郵件實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評論

布拖县| 信阳市| 和田县| 辉县市| 唐山市| 东丽区| 水富县| 汝南县| 清河县| 镇巴县| 孙吴县| 名山县| 昔阳县| 渑池县| 宁强县| 财经| 宝兴县| 东乡| 兴安盟| 永安市| 白水县| 皮山县| 静海县| 黄大仙区| 达拉特旗| 霞浦县| 高邮市| 封丘县| 湛江市| 德阳市| 三亚市| 荥经县| 南岸区| 卢氏县| 新昌县| 含山县| 淮阳县| 常熟市| 永康市| 巴彦县| 山东|