文档章节

java Es Api --解决大量数据查询

罗一鸣
 罗一鸣
发布于 2015/11/20 12:36
字数 1676
阅读 2538
收藏 2

一、配置

1.1jar包依赖

       pom.xml文件中加入依赖,使用的版本1.7.1,具体版本选择待定。

       <dependency>

             <groupId>org.elasticsearch</groupId>

             <artifactId>elasticsearch</artifactId>

             <version>1.7.1</version>

        </dependency>

1.2、环境变量

        在环境变量中增加ES服务器的IP、集群名称、节点名称等信息

二、调用方式

2.1api连接使用的类

   1)连接设置信息接口:org.elasticsearch.common.settings.Settings

     对应的实例化方类:

       org.elasticsearch.common.settings.ImmutableSettings

 

   2)连接对象接口:org.elasticsearch.client.Client

     对应的实例化类:

       org.elasticsearch.client.transport.TransportClient

2.2、基本调用示例

1)创建连接elasticsearch服务的Settings ,其中"elasticsearch"为集群名称,"Aftershock"为节点名称,代码如下:

      Settings settings = ImmutableSettings.settingsBuilder()

       .put("client.transport.sniff", true)

       .put("elasticsearch", "Aftershock")

       .build();

 

2)创建连接elasticsearch服务的Client,其中"127.0.0.1"ES的机器ip,代码如下:

      Client client = new TransportClient(settings)

       .addTransportAddress(

          new InetSocketTransportAddress("127.0.0.1", 9300)

        );

2.2.1、写入数据

1)写入数据使用client对象的prepareIndex方法

2)写入参数(indextypeid

3)再使用setSource方法写入数据的jsonBuilder对象

4)代码需要try catch

5)具体代码如下:

try {

   client.prepareIndex("transactional_detail", "detail", "1")

   .setSource(

      XContentFactory.jsonBuilder().startObject()

      .field("id", "1")

      .field("user_id", "5013")

      .field("scheme_id", 23)

      .field("commssion", 15.30)

      .field("order_Date", "20130801175520")

      .field("status",1)

      .endObject())

   .execute()

   .actionGet();

} catch (ElasticsearchException e) {

         e.printStackTrace();

      } catch (IOException e) {

         e.printStackTrace();

      }

2.2.2、读取数据

1)使用clientprepareSearch方法,传入index索引参数

2)设置相应的查询type以及查询类型、查询条件、分页、排序等等,所有参数都是可选的。

3)具体代码如下:

SearchResponse response =

    client.prepareSearch("transactional_detail")// 索引名称

   .setTypes("detail")// type名称

   .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) // 设置查询类型,精确查询

   .setQuery(QueryBuilders.termQuery("user_id", "5013"))// 设置查询关键词

   .setFrom(0)// 分页起始条数

   .setSize(60)// 分页数量

   .setExplain(true)// 设置是否按查询匹配度排序

   .execute().actionGet();

2.3、节点集群封装

    因为client操作是针对节点的,但是我们实际使用部署的是一个集群,所以需要针对节点client的获取进行封装。使用统一的配置分配索引信息,代码中根据索引来获取相应的client对象

三、ES提供的API

3.1、单条件查询

   使用clientprepareSearch查询方法,传入setQuery对象,对象中写入查询条件,具体代码如下:

 

  //生成查询QueryBuilder对象,termQuery方法相当于SQL中的字符串相等匹配。

  QueryBuilder query= QueryBuilders.termQuery("user_id", "5013")

 

  //进行查询,传入query对象作为参数

  SearchResponse response =

      client.prepareSearch("transactional_detail")// 索引名称

     .setTypes("detail")// type名称

     .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) // 设置查询类型,精确查询

     .setQuery(query)// 设置查询关键词

     .execute().actionGet();

3.2、多条件查询

   1)多条件查询代码跟3.1中相同,但是可以传入多个termQuery条件

   2)先生成查询条件对象,使用boolQuery()模式,可以增加多个查询条件

   3)其其中must表示必须满足,mustNot表示必须不满足,should表示可有可无

代码如下:

   QueryBuilder query =   

      QueryBuilders.boolQuery()

     .must(QueryBuilders.termQuery("user_id", "5013"))

     .must(QueryBuilders.termQuery("scheme_id", "23"))

     .mustNot(QueryBuilders.termQuery("commssion", "0"))

     .should(QueryBuilders.termQuery("status", "2"));

 

  SearchResponse response =

       client.prepareSearch("transactional_detail")// 索引名称

            .setTypes("detail")// type名称

            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)// 设置查询类型,精确查询

            .setQuery(query)// 设置查询关键词

            .execute().actionGet();

3.3、模糊匹配

1)模糊匹配使用wildcardQuery方法,采用通配符进行查询

2)通配符包括?匹配一个任意字符和*匹配零个或多个任意字符

3)可以跟其它条件组合进行查询,参考3.2的使用方法

代码如下:

QueryBuilder query =

      QueryBuilders.wildcardQuery("user_id", "*13*");

 

SearchResponse response =

      client.prepareSearch("transactional_detail")// 索引名称

           .setTypes("detail")// type名称

           .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)// 设置查询类型,精确查询

           .setQuery(query)// 设置查询关键词

           .execute().actionGet();

3.4、范围查询

1)范围查询使用rangeQuery方法,并且设置起始和结束值,区间是否闭合使用includeLowerincludeUpper参数。

2)具体代码如下:

QueryBuilder query =

        QueryBuilders.rangeQuery("commssion")

        .from(10)

        .to(20)

        .includeLower(true)

        .includeUpper(true);

 

SearchResponse response =

        client.prepareSearch("transactional_detail")// 索引名称

            .setTypes("detail")// type名称

            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)// 设置查询类型,精确查询

            .setQuery(query)// 设置查询关键词

            .execute().actionGet();

3.5、排序、分页

1) 使用clientsetFromsetSize参数进行分页

2)使用SortBuilder对象设置排序规则,然后再查询中加入sort属性

3)具体代码如下:

 

//使用matchAllQuery方法查询所有数据

QueryBuilder query = QueryBuilders.matchAllQuery();

 

//使用SortBuilder对象设置排序规则

SortBuilder sort =

       SortBuilders

       .fieldSort("order_Date")//排序字段

       .order(SortOrder.DESC);//升序或者降序

 

//进行查询

SearchResponse response =

   client.prepareSearch("transactional_detail")// 索引名称

   .setTypes("detail")// type名称

   .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)// 设置查询类型,精确查询

   .setQuery(query)// 设置查询关键词

   .addSort(sort)// 设置排序规则

    .execute().actionGet();

3.6、查询结果集数量统计

      使用查询方法的返回对象response里,都会有满足查询条件的文档的数量统计,获取方法response.getHits().getTotalHits();

3.7、分组聚合

1)分组聚合采用addAggregation参数设置

2AbstractAggregationBuilder参数可以进行字段分组,进行数量统计或者字段求和

3)此功能可以满足报表查询的总金额等统计功能,但是缺点是统计的内容是针对所有查询结果的,统计内容不能进行分页输出,所以只能实现总量统计,而不能实现相当于综合报表的group by之后再分页展示。

4)具体代码如下:

      //先设置查询条件

  QueryBuilder query =

      QueryBuilders.termQuery("status", "2");

 

      //再设置分组统计以及求和规则

  AbstractAggregationBuilder term =

       AggregationBuilders.terms("terms")

       .field("user_id")

       .subAggregation(

           AggregationBuilders

           .sum("commssion_Sum")

           .field("commssion")

       )

       .subAggregation(

            AggregationBuilders

            .sum("status_Sum")

            .field("status")

       );

 

       //传入查询条件和分组规则,进行查询

SearchResponse response =

      client.prepareSearch("transactional_detail")// 索引名称

            .setTypes("detail")// type名称

            .setQuery(query)

              .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

            .addAggregation(term)

              .setFrom(0)// 分页起始条数

            .setSize(20)// 分页数量

            .execute().actionGet();

 

3.9、更新field

       1)更新一条记录,采用写入数据的方式,只要指定了(indextypeid)三个参数,并且原先有记录,那么就是更新操作

       2)写入数据参照2.2.1的写入数据

3.8、新增field(批量更新)

        1)新增field也是采用写入数据的方式,使用批量更新方法,循环修改所有记录

        2)批量更新使用BulkRequestBuilder对象,循环写入需要修改的对象,最后执行execute()方法

       3)具体代码如下:

  //初始化BulkRequestBuilder对象

BulkRequestBuilder bulkRequest = client.prepareBulk();

     

     

   try {//add方法写入多个修改对象,可以增加字段,实现新增field

         bulkRequest.add(client

          .prepareIndex("transactional_detail", "detail", "1")

          .setSource(

                XContentFactory.jsonBuilder()

                 .startObject()

                 .field("id", "1")

                 .field("user_id", "5013")

               .field("ad_id", "13")

                 .field("scheme_id", 23)

                 .field("commssion", 15.30)

               .field("order_Date", "20130801175520")

                 .field("status", 1)

                 .endObject())

            );

      } catch (IOException e) {

         e.printStackTrace();

      }

 

       //最后批量提交

      BulkResponse bResp = bulkRequest.execute().actionGet();

 

 

© 著作权归作者所有

罗一鸣
粉丝 14
博文 17
码字总数 18048
作品 0
杭州
程序员
私信 提问
Elasticsearch JDBC案例介绍

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3以后的版本可以通过jdbc操作es,该功能还在不断的完善当中,本文介绍es jdbc使用方法。 1.首先在工程中导入es ...

bboss
2018/09/30
2.3K
0
Elasticsearch入门实践

一. 系统环境 操作系统:CentOS release 6.8 (Final) ES版本:6.1.1 二. 安装 先确认安装了Java运行时环境: 解压ES压缩包: 三. 启动 1. 启动ES单节点 当然,对于在后台以守护进程模式运行的...

哲别0
2018/06/06
237
0
Elasticsearch SQL ORM查询案例介绍

bboss ES SQL是针对es jdbc的替代解决方案 the best elasticsearch highlevel java rest api-----bboss bboss 提供一组sql和fetchQuery API,可替代官方es jdbc模块;采用bboss即可拥有bboss...

bboss
2018/10/17
2.9K
0
Elasticsearch Rest Client bboss v5.1.5 发布

The best Elasticsearch Highlevel Rest Client API-----bboss v5.1.5 发布。 主要功能特色 ElasticSearch兼容性:2.x,5.x,6.x,+ JDK兼容性: jdk 1.6+ Spring boot兼容性:1.x,2.x ORM和DSL二......

bboss
2018/10/25
1K
1
elasticsearch入门到放弃之elasticsearch-in-java

代码地址:https://github.com/zhaoyunxing92/spring-boot-learn-box/tree/master/spring-boot-elasticsearch 在java中使用自带的api操作。你可以先看下elasticsearch入门到放弃之docker搭建......

zhaoyunxing
07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JIT编程与方法内联

JIT的比较冷门,首先你要读一下这两篇 帖子: 《面向JIT编程-方法内联》 https://blog.csdn.net/u012834750/article/details/79488572 《浅谈对JIT编译器的理解》 https://www.cnblogs.com/...

爱吃窝窝头
2分钟前
1
0
基于TCP的RPC实现

RPC即远程服务调用 出现原因:随着项目越来越大,访问量越来越大,为了突破性能瓶颈,需要将项目拆分成多个部分,这样比起传统的项目都是本地内存调用,分布式的项目之间需要在网络间进行通信...

少年已不再年少
11分钟前
3
0
OSChina 周二乱弹 —— 他只能用这个办法劝你注意身体了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# Kodaline《High Hopes》 《High Hopes》- Kodaline 手机党少年们想听歌,请使劲儿戳(这里) @xiaoshiyue :仙女...

小小编辑
32分钟前
856
15
Spring Boot Actuator 整合 Prometheus

简介 Spring Boot 自带监控功能 Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等。这一节结合 Prometheus 、Grafana 来更加直观...

程序员果果
41分钟前
11
0
Linux文件查找命令详解

对于文件查找,我们最好用的还是属于find命令了,在说find命令之前,先把另外几个查找命令介绍一下。 目录 0x01 查询命令介绍 0x02 find命令介绍 0x01 查询命令介绍 在介绍之前,首先先了解一...

无心的梦呓
42分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部