热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Springboot集成ElasticSearch功能

ElasticSearch简介ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elastic

ElasticSearch简介

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。

ElasticSearch安装

本文仅介绍windows下单机部署,单机部署非常简单,只需要下载ElasticSearch对版本的zip包,解压直接执行解压目录下的elasticsearch.bat文件即可,前提是环境变量配置好JAVA_HOME,且版本正确即可。

打开浏览器输入http://localhost:9200/出现一下结果就表示启动成功。

Spring boot集成ElasticSearch功能

 

基于JPA方式实现集成

本文介绍的都是基于Spring boot的集成,其他的不考虑。

首先maven配置中增加spring-boot-starter-data-elasticsearch 依赖。

 

org.springframework.boot

spring-boot-starter-data-elasticsearch

 

然后就可以开始我们的开发了

和JPA类似,创建一个DTO和Mapper

Spring boot集成ElasticSearch功能

 

创建一个Entity文件,关联到ES中的document,

Spring boot集成ElasticSearch功能

 

增加Document注解,indexName表示关联的索引名称,type是类型名称,类似数据库中的库和表。

注意:需要一个id字段,或者可以通过@Id注解,否则会执行不通过。这里有个问题,如果使用JPA方式的话,由于插入需要比较找个id,因此如果数据量大的话,会查询是否主键冲突,一次数据量大的情况下,我这里出现到后来,插入效率显著变低的情况。

然后创建一个Mapper,继承ElasticsearchRepository,一行代码不需要写。

Spring boot集成ElasticSearch功能

 

然后,注入这个对象,就可以和操作数据一样来对索引进行增加、删除、查询了,支持分页和排序。

使用ElasticsearchTemplate

由于,实际开发过程中发现随着插入的数据越来越多,插入速度越来越慢。因此将索引按时间存放了,JPA方式只能绑定固定的索引,因此采用了ElasticsearchTemplate方式来插入和查询。

批量插入数据

Spring boot集成ElasticSearch功能

 

创建一个querylist,然后往里面填数据indexQuery,最后elasticsearchTemplate.bulkIndex批量将数据插入,这里得考虑内存消耗问题,如果超过一定的阈值的话,需要分批插入,否则可能会内存溢出。一般来说一秒钟大概是1W条数据。

2.查询

如下图

Spring boot集成ElasticSearch功能

 

首先创建一个BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery;

根据需求不同增加如下内容

queryBuilder.must(QueryBuilders.termQuery(columName, value));

表示必须满足column对应的值为value的情况,该对象还有mustnot和should。mustnot大家都知道表示不等于,should是多个条件,只要满足一条即可。

创建一个Pageable对象

pageable = PageRequest.of(pagefrom(从第几页开始), pagesize(每一页多少条), Sort.Direction.DESC(排序方式), [“time”,”name”]排序字段));

然后创建一个NativeSearchQuery对象

searchQuery = new NativeSearchQueryBuilder

.withIndices(“indeces”) //索引名称

.withTypes(“type”) //type名称

.withQuery(queryBuilder)// 查询条件

.withPageable(pageable)//增加分页方式

.build;

然后开始执行查询

AggregatedPage aggregatedPage = elasticsearchTemplate.queryForPage(searchQuery, SafetyState.class);第一个参数是上面创建的查询条件,第二个是对应的实体类。这个查询包括了查询了多少条,当前为第几页等信息。aggregatedPage.getContent可以获得查询出来的结果。

也可以queryforlist方法,这个直接返回查询结果列表。

聚合查询

Spring boot集成ElasticSearch功能

 

和查询类似首先创建一个查询条件

其次创建一个TermsAggregationBuilder,表示分组。

再次创建ValueCountAggregationBuilder对象,该对象表示统计个数,其他还有AvgAggregationBuilder等汇聚方式,可查看AggregationBuilders对象的工厂方法。

Spring boot集成ElasticSearch功能

 

然后将汇聚countAgg,增加为agg分组的子聚合aggTime.subAggregation(countAgg);分组后面需要增加size否则只会查出10条数据。

从查询结果里面取数据比较啰嗦,大家可以参考我贴图修改既可以

bucket.getKeyAsString, bucket.getDocCount),for循环中中获取bucket的key就是汇聚分组字段值,docCount就是分组统计结果,我这里是统计的个数,写的是count。

注意事项

ElasticsearchTemplate查询如果不指定大小只会展示10条,page查询中可以设置pagesize和pagefrom来获取,聚合查询指定size来指定。

ElasticsearchTemplate 如果和radis一起使用的话,要在启动方法中增加System.setProperty("es.set.netty.runtime.available.processors","false");否则启动的时候会有报错:availableProcessors is already set to [8]

JPA方式插入索引,一定要指定id字段,且为全局唯一,否则会有插入失败的问题。

如果插入的对象有id值,插入效率会越来越低,因为需要判断key是否重复,并且生成的索引会比较大。

为了减少插入时间则需要让ES自动生成ID,目前来看只有ElasticsearchTemplate可以实现。

ES的查询效率还是可以的4千万条数据的查询在秒级

 

 

 

 

 

 

 


推荐阅读
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
author-avatar
壹舊雲A
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有