`
wiselyman
  • 浏览: 2094280 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
Group-logo
点睛Spring4.1
浏览量:82372
74ae1471-94c5-3ae2-b227-779326b57435
点睛Spring MVC4...
浏览量:130814
社区版块
存档分类
最新评论

基于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的数据的一致性?

当老数据库有大量数据需要导入Elasticsearch时,可参考博客:http://www.wisely.top/2018/02/24/spring-batch-elasticsearch/

Spring Data Elasticsearch使用的是transport client,而Elasticsearch官网推荐使用REST client。阿里云的Elasticsearch使用transport client目前还在存在问题,阿里云推荐使用REST client。

本示例使用的是Spring Data Jest链接Elasticsearch,Elasticsearch的版本为:5.5.3(目前只有spring boot 2.0以上版本支持)

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();
 
0
0
分享到:
评论

相关推荐

    基于Spring Data Jest的Elasticsearch数据统计示例

    本文主要介绍了基于Spring Data Jest的Elasticsearch数据统计示例,并介绍了一些相关的知识点,例如命令查询职责分离模式、事件驱动、Spring Data Jest、Elasticsearch、Transport Client和REST Client等。

    spring-data-jest, Jest的Spring Data 实现.zip

    spring-data-jest, Jest的Spring Data 实现 Spring Data Jest 基于on客户端的ElasticSearch的Spring Data 实现仅在 HTTP ( 例如AWS上) 可以访问的情况下使用 Spring Data 和ElasticSearch群集。

    基于Spring Batch向Elasticsearch批量导入数据示例

    基于Spring Batch向Elasticsearch批量导入数据示例 本文介绍了基于Spring Batch向Elasticsearch批量导入数据示例,旨在解决大规模数据从数据库导入Elasticsearch时的效率问题。Spring Batch框架使用ItemReader分页...

    elasticsearch结合spring springmvc jest 使用做成WEB架构

    本教程将详细讲解如何将Elasticsearch与Spring框架(包括Spring和Spring MVC)以及Jest客户端集成,以创建一个功能完备的Web架构。 1. **Elasticsearch简介** Elasticsearch是一个基于Lucene的分布式、实时的搜索...

    spring-data-jest:Jest的Spring数据实现

    基于Jest Rest客户端的ElasticSearch的Spring Data实现 将Spring Data与仅可通过HTTP访问的ElasticSearch集群一起使用(例如在AWS上)非常有用。 版本号 Spring数据开玩笑 弹簧靴 弹簧数据弹性搜索 笑话 弹性搜索 ...

    elasticsearch-study:基于Spring Boot2.2 + Spring Data ElasticSearch3.2.0与ElasticSearch6.8.2环境的开发项目

    基于ElasticSearch6.8.2进行开发项目描述基于Docker环境运行的ElasticSearch6.8.2,目前项目中集成了3种与ElasticSearch交互的API:使用Spring Data ElasticSearch 3.2.0,需使用ES API为6.8.2使用Rest High Level ...

    SpringBoot 集成ElasticSearch两个依赖的jar

    Spring Data Elasticsearch提供了一套基于Spring Data的API,使得开发者可以使用熟悉的Spring编程模型来操作Elasticsearch。它支持实体映射、索引管理、查询构造等功能,极大地简化了Elasticsearch的使用。要添加此...

    SpringBoot专题学习Part28:SpringBoot整合Elasticsearch(使用Jest和Spring Data Elasticsearch进行操作)

    在Spring Boot应用中整合Elasticsearch,我们可以利用两种主要的技术:Jest和Spring Data Elasticsearch。本文将重点关注如何使用Jest客户端进行操作。 Elasticsearch是一个强大的分布式搜索和分析引擎,其核心是...

    es工具封装,最新的springboot集成jpa和jest,集群

    综上所述,这个项目提供了一种高效的方式来在Spring Boot应用中使用Elasticsearch,通过JPA简化数据操作,并通过Jest客户端实现了与ES的通信。同时,集群配置确保了应用可以在多节点环境中运行,提高了可用性和可...

    elasticsearch聚合后分页

    方法如果传总页数了,es就不用查询总页数,直接通过开始位置到结束位置取数即可

    SpringBoot Elasticsearch.docx

    通过以上步骤,我们可以完成Spring Boot与Elasticsearch的基本集成,并且能够使用Spring Data Elasticsearch提供的便捷API进行数据的存取和查询。接下来,可以根据具体需求进一步探索和开发更多的功能。

    Spring Boot集成ElasticSearch实现搜索引擎的示例

    2.1 使用Spring Data与ElasticSearch的9300端口集成:Spring Data Elasticsearch提供了一套丰富的Repository接口,使得我们可以直接通过Java方法调用来操作ElasticSearch。配置完成后,Spring Boot会自动连接到默认...

    Elasticsearch学习资料整理

    - **与SpringBoot集成**:使用`spring-data-elasticsearch`库,简化了与Spring框架的整合,不过只支持到Elasticsearch 2.4.6版本。 - **ES 5.x集成**:对于更高版本,需要通过客户端如Transport Client或Jest进行...

    elasticsearch指南

    例如,使用RESTful API、JEST客户端或者SpringData Elasticsearch等技术实现。 总之,Elasticsearch不仅提供了强大的数据检索和分析能力,同时也支持通过各种编程语言和框架进行集成,是构建现代大数据应用不可或缺...

    springboot整合elasticsearch.md

    - 与 Elasticsearch 版本无关,适用于所有版本的 ES。 - **缺点**: - 不具备高级功能,如批量操作等。 - **应用场景**: - 当需要与不同版本的 Elasticsearch 集群交互时非常有用。 - **Java High Level REST...

    ElasticSearch个人详细总结

    4. **Spring Data ElasticSearch**:整合 Spring 框架,提供一套 Spring 风格的 API。 5. **Jest**:一个基于 Java 的 Elasticsearch REST 客户端,提供简单的异步 API。 每种客户端都有其适用场景,根据项目需求...

    ElasticSearch Java开发Demo.zip

    ElasticSearch Java:ransportClient将会在后面的版本中弃用,因此不推荐后续使用;而Jest由于是社区维护,所以更新有一定...Spring Data Elasticsearch主要是与Spring生态对接,可以在web系统中整合到Spring中使用。

    spring-boot-reference.pdf

    Connecting to Elasticsearch by Using Spring Data 30.6.3. Spring Data Elasticsearch Repositories 30.7. Cassandra 30.7.1. Connecting to Cassandra 30.7.2. Spring Data Cassandra Repositories 30.8. ...

    使用SSM框架(SpringBoot、SpringSecurity、MyBatis)开发的一个简单校园多商家食堂点餐平台.zip

    使用SSM框架(SpringBoot、SpringSecurity、MyBatis)...搭建了Linux环境,利用docker安装好了elasticsearch,同时在项目test里测试了elasticsearch,发现springboot data ES会报错nodes找不到,而jest却能正常存值和取值

Global site tag (gtag.js) - Google Analytics