【ElasticSearch实战】——java操作ES基本查询在项目中应用

本文介绍了在语音质检项目中,如何使用Java进行Elasticsearch的基本查询,包括精确查询、模糊查询和时间范围查询的实现。同时,文章提供了统计机器和人工质检不合格数量的代码示例,并鼓励读者关注项目以获取更多关于Java操作ES的高级查询和统计方法。
摘要由CSDN通过智能技术生成

引言

最近小编负责的一个语音质检 项目中用到了ES,下面结合实例代码分享一下java操作ES查用的查询写法。

关于es的基本操作,例如新建索引、查询封装类,请参考前面博客:【ElasticSearch实战】——封装java操作es基础架构

1、ES在项目中的位置

              

2、项目查询需求

 

从上面查询条件来看,其中包括了精确查询,模糊查询及时间范围查询等,这些查询 都会在下面 样例代码中给出,并且还有部分统计的写法,例如机器质检不合格的数量, 人工审核不合格的数量等。

3、查询代码

package com.jack.search.es.service;

import com.jack.common.constant.SearchConstants;
import com.jack.search.es.model.CaseCallCheckListQueryInfo;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.filter.Filter;
import org.elasticsearch.search.aggregations.bucket.filter.FilterAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.cardinality.Cardinality;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author zhenghao
 * @description: 录音库查询
 * @date 2019/10/1115:49
 */
@Service
public class CallCheckQueryService {

    @Autowired
    private QueryService queryService;
    @Autowired
    private ElasticSearchService elasticSearchService;

    public Map<String, Object> getCallCheckList(CaseCallCheckListQueryInfo queryInfo) {
        if (queryInfo == null) {
            return null;
        }
        //构造查询条件
        BoolQueryBuilder boolQueryBuilder = this.getCallCheckQueryBuilder(queryInfo);
        //排序
        String orderBy = queryInfo.getOrderBy();
        if (StringUtils.isEmpty(orderBy)) {
            orderBy = String.format("%s:%s", "telTime", "desc");
        }
        //分页
        Integer pageNo = queryInfo.getPageNo();
        if ((pageNo == null) || (pageNo <= 0)) {
            pageNo = 0;
        } else {
            pageNo -= 1;
        }

        Integer pageSize = queryInfo.getPageSize();
        if ((pageSize == null) || (pageSize < 1)) {
            pageSize = 10;
        }
        //构造排序构造器FieldSortBuilder,设置排序参数
        String[] orderStr = orderBy.split(":");
        FieldSortBuilder sort = SortBuilders.fieldSort(orderStr[0]).order("desc".equalsIgnoreCase(orderStr[1])? SortOrder.DESC:SortOrder.ASC);

        //AggregationBuilder 相当于 mysql中的 group by
        //第一级机器质检不合格数据聚合 聚合名称为 hasError ,聚合数据条件为 字段 hasError>=1
        FilterAggregationBuilder hasErrorAggregationBuilder = AggregationBuilders.filter("hasError", QueryBuilders.rangeQuery("hasError").gte(1));
        //构造第二级子聚合 每一个质检项的值 >=1  注意:每一个checkItem 是一个字段,代表一个质检项 0代表没有命中该质检项,大于0代表表中
        for (int i = SearchConstants.CHECK_ITEM_MIN; i<= SearchConstants.CHECK_ITEM_MAX; i++) {
            String checkItemName = String.format("checkItem%d", i);
            hasErrorAggregationBuilder.subAggregation(AggregationBuilders.filter(checkItemName, Que
### 回答1: 这个项目实战的目标是使用Java版本的Spark将Hive表的数据写入Elasticsearch。具体步骤如下: 1. 首先,需要在Spark创建一个JavaSparkContext对象,并且设置相关的配置,比如Elasticsearch的地址和端口号等。 2. 接下来,需要使用HiveContext对象来读取Hive表的数据。可以使用HiveContext的sql方法来执行Hive SQL语句,或者使用HiveContext的table方法来读取Hive表的数据。 3. 读取Hive表的数据后,需要将数据转换成Elasticsearch的格式。可以使用JavaRDD的map方法来实现数据的转换。 4. 转换完成后,需要将数据写入Elasticsearch。可以使用JavaRDD的foreachPartition方法来实现数据的批量写入。 5. 最后,记得关闭JavaSparkContext对象。 以上就是使用Java版本的Spark将Hive表的数据写入Elasticsearch的步骤。需要注意的是,具体实现过程还需要考虑一些细节问题,比如数据类型的转换、数据的去重等。 ### 回答2: 在实现Spark将Hive表的数据写入Elasticsearch的过程,首先需要搭建好相关的环境,包括Hadoop、Hive和Elasticsearch等。然后,根据Spark的API接口,可以编写相关的Java代码来实现将Hive表的数据写入Elasticsearch操作。 具体实现步骤如下: 1. 导入相关依赖:在Maven项目,需要添加以下依赖: ```xml <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scalaVersion}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scalaVersion}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>${hive.version}</version> </dependency> ``` 其,${scalaVersion}、${spark.version}、${elasticsearch.version}和${hive.version}需要根据实际情况进行替换。 2. 初始化SparkConf和SparkSession对象:在Java代码,需要先初始化SparkConf和SparkSession对象: ```java SparkConf conf = new SparkConf().setAppName("Spark-Hive-Elasticsearch"); SparkSession spark = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate(); ``` 其,setAppName用于设置Spark应用程序的名称,getOrCreate用于获取一个已有的Spark或创建一个新的Spark。 3. 读取Hive表的数据:可以使用SparkSession的read方法读取Hive表的数据,如下所示: ```java DataFrame df = spark.read().table("mytable"); ``` 其,mytable为Hive表的名称。 4. 配置Elasticsearch索引:在将Hive表的数据写入Elasticsearch时,需要配置相关的索引,如下所示: ```java Map<String, String> esConfig = new HashMap<>(); esConfig.put("es.nodes", "localhost"); esConfig.put("es.port", "9200"); esConfig.put("es.resource", "myindex/mytype"); ``` 其es.nodeses.port用于配置Elasticsearch的地址和端口,es.resource用于指定Elasticsearch的索引名称和类型名称。 5. 将Hive表的数据写入Elasticsearch:可以使用DataFrame的write方法将Hive表的数据写入Elasticsearch,如下所示: ```java df.write().format("org.elasticsearch.spark.sql").mode(SaveMode.Append).options(esConfig).save(); ``` 其,format指定了保存的格式为Elasticsearch格式,mode指定了保存的模式为Append,options指定了保存的配置项。 通过上述步骤,即可实现Spark将Hive表的数据写入Elasticsearch操作。当然,在实际应用过程,还需要根据具体需求进行相关的优化和调整。 ### 回答3: 这个项目实战的主要目的是将Hive表的数据写入到Elasticsearch。Hive是Hadoop的数据仓库,而Elasticsearch则是一个高性能的搜索和分析引擎。将这两个系统结合起来可以实现更好的数据分析和可视化。 在开始实现之前,需要先搭建好Hadoop和Elasticsearch环境,并且熟悉Java编程语言和Spark框架。接下来,可以按照以下步骤进行实现。 第一步:配置Maven项目并添加Spark和Elasticsearch的依赖库。在pom.xml文件添加以下代码: ``` <!-- Spark --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.5</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.5</version> </dependency> <!-- Elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>7.6.2</version> </dependency> ``` 第二步:编写代码读取Hive表的数据。使用Spark SQL读取Hive表数据并将其转换为DataFrame,例如: ``` String tableName = "hive_table_name"; Dataset<Row> df = sparkSession.table(tableName); ``` 第三步:将DataFrame的数据写入Elasticsearch。使用Elasticsearch Spark库提供的API来将数据写入Elasticsearch,例如: ``` // 配置Elasticsearch参数 Map<String, String> esConfigs = new HashMap<>(); esConfigs.put("es.nodes", "localhost"); esConfigs.put("es.port", "9200"); esConfigs.put("es.mapping.id", "id"); // 写入数据 df.write().format("org.elasticsearch.spark.sql") .options(esConfigs).mode("overwrite") .save("index_name/document_type"); ``` 最后一步:运行代码并验证数据是否已经成功写入Elasticsearch。可以使用Kibana界面进行数据可视化展示和分析。 通过以上步骤,就可以成功实现将Hive表的数据写入Elasticsearch的功能。这个项目实战可以帮助开发人员更好地理解和应用Spark和Elasticsearch技术,并且提升数据分析和可视化的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

g-Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值