es使用和常用查询(包含多字段聚合查询,实体类方式保存es)

这篇具有很好参考价值的文章主要介绍了es使用和常用查询(包含多字段聚合查询,实体类方式保存es)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.导入es相关jar包

   <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-elasticsearch</artifactId>
                <version>4.2.11</version>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>7.12.1</version>
   </dependency>

2.增加es配置

elasticsearch:
  hosts: es-service.xiot-v2.svc.cluster.local:port
  storage-strategy: NONE    #分库规则 按日分 DAY, 按月分 MONTH, 按年分 YEAR, 不分 NONE
  shard: 1      #分片数量

3.读取es相关配置 

@Configuration
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {

    @Value("${elasticsearch.hosts}")
    private String HOST;

    @Override
    public RestHighLevelClient elasticsearchClient() {
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo(HOST)
                .build();
        return RestClients.create(clientConfiguration).rest();
    }
}

 4.创建es实体类,与es mapping设计一致

@Data
@Document(indexName = "data",createIndex = false)
public class ESData {
    @Id
    @Field(type = FieldType.Text)
    @JSONField(name = "id")
    private String id;

    /**
     *  数据时间点: 相对于 UTC-0 1970-1-1 0 点的毫秒数
     */
    @Field(name="ts",type = FieldType.Long)
    @JSONField(name = "ts")
    private Long ts;

    //设备说明
    @Field(name= "signature.type",type = FieldType.Keyword)
    @JSONField(name = "signature.type")
    private String signatureType;
}

 5.创建es结构

1.新建index:data
put http://ip:port/data

2.新建mapping
put http://ip:port/data/_mapping


{

	"properties": {


		"ts": {
			"type": "long"
		},
		"name": {
			"type": "keyword"
		},
		"test": {
			"type": "nested",
			"properties": {
				"voltage": {
					"type": "nested",
					"properties": {
						"avg": {
							"type": "keyword"
						},
						"min": {
							"type": "keyword"
						},
						"max": {
							"type": "keyword"
						}
					}
				}

			}

		}

 6.创建类继承 ElasticsearchRepository 实现通过api保存实体类ESData到es

public interface ESRepository extends ElasticsearchRepository<ESData, String> {
}

 7.保存实体类ESData到es

//1.注入
 @Autowired
 private ESRepository esRepository;

public void insertData(){

//2.初始化实体类,插入数据
  ESData  data = new ESData();

        ....

//3.通过实体类保存es
 esRepository.save(data);

}


 8.es查询 多字段匹配查询,分组查询,分组后聚合文章来源地址https://www.toymoban.com/news/detail-772050.html

@Service
public class EsSearchService {
    @Autowired
    private RestHighLevelClient client;


/**
先查询 后分组 再统计
*/

 public List<HashMap> searchBills(LocalDateTime begin, LocalDateTime end,String boxName){
        //设置查询es的index
        SearchRequest searchRequest = new SearchRequest("data");
        //2.创建 SearchSourceBuilder条件构造。
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //若时间未传查询过去七日数据
        Long beginTime = null;
        Long endTime = null;
        if(begin==null){
            beginTime =             
        LocalDateTime.now().plusDays(-7).toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
        }else{
            beginTime = begin.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
        }
        if(end==null){
            endTime = LocalDateTime.now().toInstant(ZoneOffset.ofHours(8)).toEpochMilli()	;
        }else{
            endTime = end.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
        }

        //相当于and查询
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.filter(QueryBuilders.rangeQuery("ts").from(beginTime).to(endTime));
        if(StringUtils.isNotEmpty(boxName)){
            boolQuery.must(QueryBuilders.termQuery("boxName",boxName));
        }
        searchSourceBuilder.query(boolQuery);
        //去重
        CollapseBuilder collapseBuilder = new CollapseBuilder("ts");
        searchSourceBuilder.collapse(collapseBuilder);
        //多字段分组
        TermsAggregationBuilder aggregation = AggregationBuilders.terms("aggs_group")
                .script(new Script("doc['f1'] +'#'+doc['f2']+'#'+doc['f3']+'#'+doc['f4']+'#'+doc['f5']"))
                .size(Integer.MAX_VALUE) .order(BucketOrder.aggregation("_key", true));
//sum聚合        aggregation.subAggregation(AggregationBuilders.sum("f6").field("sum1"))
                .subAggregation(AggregationBuilders.sum("f7").field("sum2"));

        searchSourceBuilder.aggregation(aggregation);

        //3.将 SearchSourceBuilder 添加到 SearchRequest中
        searchRequest.source(searchSourceBuilder);

        //4.执行查询
        SearchResponse searchResponse = null;
        try {
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //5.解析查询结果
        System.out.println("花费的时长:" + searchResponse.getTook());
        List<HashMap> result=new ArrayList<>();
        if(RestStatus.OK.equals(searchResponse.status())) {
            // 获取聚合结果
            Aggregations aggregations = searchResponse.getAggregations();
            Terms byAggsAggregation = aggregations.get("aggs_group");
            for(Terms.Bucket buck : byAggsAggregation.getBuckets()) {
                HashMap map=new HashMap();
                String[] arr= buck.getKeyAsString().split("#");
                //取子聚合
                ParsedSum sum1 = buck.getAggregations().get("sum1");
                ParsedSum sum2 = buck.getAggregations().get("sum2");
                map.put("f1",arr[0].replace("[","").replace("]",""));
              
                map.put("sum1",sum1.getValue());
                map.put("sum2",sum2.getValue());
           

                result.add(map);
            }
        }

        return result;
    }


}

到了这里,关于es使用和常用查询(包含多字段聚合查询,实体类方式保存es)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ES常用查询】基于ElasticsearchRestTemplate及NativeSearchQuery的查询

    包含当前es所有的查询, 需要什么代码直接照搬,改个参数就行! 用的好请务必给我点赞!!!感谢爱你们!!! 为啥写这篇文章呢: 大概是因为目前公司用的api跟以前的不太一样, 以前我们是基于高标准客户端直接做的, 但是目前这边同事是基于ElasticsearchRestTemplate跟

    2024年02月03日
    浏览(31)
  • ES查询常用语法

    目录 1. ElasticSearch之查询返回结果各字段含义 2. match 查询 3. term查询 4. terms 查询 5. range 范围 6. 布尔查询 6.1 filter加快查询效率的原因 7. boosting query(提高查询) 8. dis_max(最佳匹配查询) 9. 分页 10. 聚合查询【内含实际的demo】 执行命令:索引库名称/_search 空搜索的结果为: 按照

    2023年04月09日
    浏览(40)
  • ES学习-常用的查询接口

    我们有大部分数据要通过es进行查询,上周在查的时候发现有些不会,今天有空琢磨了一下 常用的查询接口整理成collection了,附在链接里哈哈哈哈哈哈哈 链接:   https://pan.baidu.com/s/1RSFvgbNALPmItW9unvb7Dg?pwd=qwer   提取码: qwer 复制这段内容后打开百度网盘手机App,操作更方便哦

    2024年02月09日
    浏览(27)
  • 工作常用ES DSL查询语句(干货满满)

       工作中几乎每天都需要使用到ES查询数据,需要根据自己的查询需求构造DSL查询语句来实现,本文记录并分享本人工作中常用的DSL语句以及所遇到问题的解决方案,DSL语句灵活多变,可进行多种组合,任你搭配,让我们一起往下看,希望对你有帮助。 2.1 查看所有索引的

    2024年02月02日
    浏览(69)
  • Elasticsearch基础学习-常用查询和基本的JavaAPI操作ES

    Elasticsearch是一个基于 lucene 、分布式、通过Restful方式进行交互的 近实时搜索 平台框架。 ELK技术栈是Elasticsearch、Logstash、Kibana三大开元框架首字母大写简称。 而Elasticsearch 是一个 开源的高扩展的分布式全文搜索引擎 , 是整个 ELK技术栈的核心。 Elasticsearch是一个基于lucene、分

    2024年02月11日
    浏览(48)
  • 当es使用script脚本查询聚合等操作遇到空字段报错问题解决方案

            在使用ES的脚本时,如果脚本中引用了不存在或者空的字段,则会导致脚本执行失败并抛出错误。这是因为ES会在脚本执行之前尝试检索引用的字段,如果该字段不存在则会抛出异常。         因此,在使用ES脚本时,需要确保所引用的字段都存在且不为空。可

    2024年02月11日
    浏览(40)
  • ES-1:Java的 ElasticsearchTemplate Or ElasticsearchRepository基础常用查询写法

    目录 安装elasticsearch maven 数据来源: 网易数据 mysql的相关语法 Java代码 = in like between  and is null is not null order by max min avg sum (发现es新语法 stats 直接统计聚合)

    2024年02月15日
    浏览(35)
  • DB SQL 转 ES DSL(支持多种数据库常用查询、统计、平均值、最大值、最小值、求和语法)...

    1. 简介   日常开发中需要查询 Elasticsearch 中的数据时,一般会采用 RestHighLevelClient 高级客户端封装的API。项目中一般采用一种或多种关系型数据库(如: Mysql 、 PostgreSQL 、 Oracle 等) + NoSQL(如: Elasticsearch )存储方案;不同关系数据库可以采用 Mybatis-Plus 方案屏蔽数据库的方言

    2024年01月17日
    浏览(39)
  • 如何使用ES做简单的时间条件过滤+模糊查询+精确匹配+关键字排除,查询 elasticsearch查询结果包含或排除某些字段、_source查询出需要的属性名称

    目录 一、时间条件过滤+模糊查询+精确匹配+排除 1. 查询出包含 log_geo 的数据 “wildcard”: { “message”: “log_geo” } 2. 查询某个时间段的数据 3. 条件查询与条件排除数据 4. from 表示起始的记录的ID 5. size 表示显示的记录数 6.sort排序 desc降序、asc升序  7.should查询在mysql中

    2024年01月18日
    浏览(54)
  • es查询nested字段类型数组长度来判断是否包含多个值

    使用es时经常会碰到查询数组格式的字段是否有多个值的情况,总结一下。 一、字段类型为keywork时 当字段类型为keyword时(创建索引后,添加的第一条数据id字段格式为数组格式,便会导致后续的数据都是数组),查询id字段有多值时用以下查询语句: 二、字段类型为nested类型时

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包