前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >应用接入ES(一)-Springboot集成ES

应用接入ES(一)-Springboot集成ES

作者头像
叔牙
修改于 2021-12-24 03:42:34
修改于 2021-12-24 03:42:34
4.5K20
代码可运行
举报
运行总次数:0
代码可运行

Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名。一句话来说,Elasticsearch就是专业做搜索的,支持各种复杂的检索。

那么我们有比较复杂的检索诉求的场景下,如果传统关系型数据库无法支持或者说支持成本特别高,那么就可以考虑使用Elasticsearch(以下简称ES)来作为这种场景的替代方案。

一、环境准备

1:安装ES6.8

下载安装包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.1.zip

解压:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unzip elasticsearch-6.8.1.zip

修改默认配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 修改jvm.options内存配置
-Xms512m-Xmx512m

## 修改elasticsearch.yaml网络访问限制,允许其他机器访问
network.host: 0.0.0.0

后台启动:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./bin/elasticsearch -d

检查启动情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl http://x.x.x.x:9200

启动正常。

2:创建索引

创建索引配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl  -H 'Content-Type: application/json' -XPUT http://localhost:9200/reverse -d'{    
"settings" : {        
    "index" : {            
            "number_of_shards" : 3, 
            "number_of_replicas" : 2 
     }  
   }
}'

这里制定了3个分片和两个副本,可以不配置使用默认。

创建映射:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -H 'Content-Type: application/json' -XPUT 'http://localhost:9200/reverse/_mapping/return_order' -d '{        
"properties" : {        
"a" : {         
 "type" : "date"        
        }
        ...
   }
}'

可以使用http://xxx.xxx.xxx.xxx:9200/reverse/_mapping/return_order查看配置的type映射内容。

二、应用集成ES

本篇我们只讲述应用集成ES完成基本crud的几种方式,对于业务数据同步到ES暂不做讲述。应用集成ES的方式大致有4种,在说具体实现方式之前引一个小插曲,看一下ES java api的一段话:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
We plan on deprecating the TransportClient in Elasticsearch 7.0 and removing it 
completely in 8.0. Instead, you should be using the Java High Level REST Client, 
which executes HTTP requests rather than serialized Java requests. The migrationguidedescribes all the steps needed to migrate.  The Java High Level REST Client currently has support for the more commonly usedAPIs, but there are a lot more that still need to be added. You can help us prioritiseby telling us which missing APIs you need for your application by adding a commentto this issue: Java high-level REST client completeness.

大致意思是ES7.0会废弃掉TransportClient(Netty基于tcp协议实现的客户端),8.0会完全移除,官方建议使用RestHighLevelClient基于http协议访问ES。

所以基于这个原因,应用集成ES按照通信协议维度,分别有以下实现方式:

  • TCP:

Jpa

ElasticSearchTemplate

  • Http

RestClient

RestHighLevelClient

Jpa是最传统的持久层框架此处不赘述,ES的Jpa由spring-data-elasticsearch实现,提供一些模板化的更新操作和查询,最大的缺点是不够灵活,对定制化操作不友好并且自定义实现有点繁杂。

ElasticSearchTemplate是类似于JdbcTemplate,也是spring-data-elasticsearch提供的对各种ES更新和查询操作的模板实现,相比ElasticsearchRepositoryapi更清晰易懂,除了支持通用的实现之外也能支持各种定制化的检索操作。

RestClient是低版本的Rest客户端,基于http协议实现,对于ES中各种操作也能够很好的支持,但是api相对复杂,无法提供更“java化”的交互,简单点说对于客户端与服务端的请求和响应棱角过明显,对于响应结果更偏向于程序自己解析和序列化。

RestHighLevelClient是基于低版本客户端RestClient实现的高亮Rest客户端,目前官方极力推荐使用RestHighLevelClient来访问ES,如果发现高版本RestClient缺失功能,则会降级到低版本RestClient来发送json请求。

接下来我们切入正题,Jpa和低版本RestClient这里不展开讲述,重点来看一下ElasticSearchTemplate和RestHighLevelClient这两种方式的实现。

1:ElasticSearchTemplate

增加ES相关配置,application.yml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  data:
      elasticsearch:
            cluster-name: elasticsearch
            cluster-nodes: host:9300 #tcp是9300      
            local: false      
            repositories:   
                 enable: false

引入依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
</dependency>
<dependency>
    <groupId>org.elasticsearch.plugin</groupId>
    <artifactId>transport-netty4-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
</dependency>

访问ES实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 自动注入ElasticSearchTemplate 
@Autowired private ElasticsearchTemplate elasticsearchTemplate;
## 查单个 
public ReturnEsDO getByReturnId(String returnId) {    
    SearchQuery query = new NativeSearchQueryBuilder()
        .withQuery(new QueryStringQueryBuilder(returnId)
        .field("returnId")).build();
    List<ReturnEsDO> list = this.elasticsearchTemplate.queryForList(query,ReturnEsDO.class);
    if(null == list || list.isEmpty()) {        
        log.warn("returnId={},result empty",returnId);        
        return null;    }    return list.get(0); 
    }
## 分页查询 
public Page<ReturnEsDO> queryPage(ReturnEsQueryParam param) {    
    String sortStr = param.getSort();    
    Sort sort = new Sort(SortEnum.DESC.getType()
        .equalsIgnoreCase(sortStr) ? Sort.Direction.DESC : Sort.Direction.ASC,"appliedTime"); 
    Pageable pageable = PageRequest.of(param.getPageNum() - 1,param.getPageSize(),sort);
    SearchQuery query = new NativeSearchQueryBuilder()            
        .withIndices(index)            
        .withTypes(type)            
        .withQuery(this.buildQuery(param))            
        .withPageable(pageable)            
        .build();    
    Page<ReturnEsDO> page = this.elasticsearchTemplate.queryForPage(query,ReturnEsDO.class);
    return page; }
## 新增doc 
public void save(ReturnEsDO returnEsDO) {    
    IndexQuery indexQuery = this.buildIndexQuery(returnEsDO);    
    String index = this.elasticsearchTemplate.index(indexQuery);    
    log.info("save success;param={},index={}",returnEsDO,index);
}
## 批量新增 
public void batchSave(List<ReturnEsDO> esDOList) {    
    List<IndexQuery> indexQueryList = esDOList.stream()            
        .map(this::buildIndexQuery)            
        .collect(Collectors.toList());   
    this.elasticsearchTemplate.bulkIndex(indexQueryList); 
}
## 删除文档 
public void delete(String returnId) {    
    DeleteQuery deleteQuery = new DeleteQuery();    
    deleteQuery.setQuery(QueryBuilders.matchQuery("returnId", returnId));   
    deleteQuery.setIndex(index);    
    deleteQuery.setType(type);    
    this.elasticsearchTemplate.delete(deleteQuery);    
    log.info("delete success;returnId={}",returnId); 
}
## 更新文档 
public void update(ReturnEsDO returnEsDO) {    
    try {       
     UpdateRequest updateRequest = new UpdateRequest()                
         .index(index)                
         .type(type)                
         .id(returnEsDO.getReturnId())                
         .doc(this.buildUpdateDoc(returnEsDO));        
     UpdateQuery updateQuery = new UpdateQueryBuilder()                
         .withIndexName(index)                
         .withType(type)                
         .withId(returnEsDO.getReturnId())                
         .withClass(ReturnEsDO.class)                
         .withUpdateRequest(updateRequest)                
         .build();        
     UpdateResponse response = this.elasticsearchTemplate.update(updateQuery);        
     log.info("update end;param={},response={}",returnEsDO,response);    
    } catch (Exception e) {        
           log.error("update occur error;param={}",returnEsDO,e);   
    } 
}

具体的构建查询和更新参数不展开描述。

2:RestHighLevelClient

该客户端是是目前官方推荐使用的RestClient。

增加ES相关配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
es:  
    host:    
        address: host    
        port: 9200    
        protocol:http

引入maven依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>    
    <groupId>org.elasticsearch.client</groupId>    
    <artifactId>elasticsearch-rest-high-level-client</artifactId> 
</dependency> 
<dependency>    
    <groupId>org.elasticsearch</groupId>    
    <artifactId>elasticsearch</artifactId> 
</dependency>
<dependency>    
    <groupId>org.elasticsearch.client</groupId>    
    <artifactId>elasticsearch-rest-client</artifactId> 
</dependency>

增加RestHighLevelClient配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class ElasticsearchConfig {
    @Value("${es.host.address}")
    private String esHostAddress;

    @Value("${es.host.port}")
    private Integer esHostPort;

    @Value("${es.hot.protocol}")
    private String protocol;

    @Bean(destroyMethod = "close")
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost(esHostAddress, esHostPort, protocol)));
        return client;
    }
}

访问ES实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 注入Client
@Autowired
private RestHighLevelClient restHighLevelClient;

## 查询单条记录
public ReturnEsDO getByReturnId(String returnId) {
    try {
        GetRequest getRequest = new GetRequest(index, type, returnId);
        GetResponse response = this.restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        Map<String, Object> map = response.getSourceAsMap();
        return this.transferMap2DO(map);
    } catch (Exception e) {
        log.error("ReturnRepository.getByReturnId occur error;returnId={}", returnId, e);
        return null;
    }
}

## 分页查询
public PageResp<ReturnEsDO> queryPage(ReturnEsQueryParam param) {
    try {
        SearchRequest request = new SearchRequest(index);
        QueryBuilder queryBuilder = this.buildQuery(param);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(queryBuilder);
        sourceBuilder.size(param.getPageSize());
        sourceBuilder.from((param.getPageNum()-1)*param.getPageSize());
        String sortStr = param.getSort();
        sourceBuilder.sort("appliedTime", SortEnum.DESC.getType().equalsIgnoreCase(sortStr) ? SortOrder.DESC : SortOrder.ASC);
        sourceBuilder.trackTotalHits(true);
        request.source(sourceBuilder);
        SearchResponse response = this.restHighLevelClient.search(request, RequestOptions.DEFAULT);
        if (null == response || null == response.getHits()) {
            log.warn("ReturnEsRepository.queryPage response empty;param={}", param);
            return PageResp.wrap(0, 0, Collections.emptyList());
        }
        SearchHits result = response.getHits();
        int totalHits = (int) result.getTotalHits();
        if (totalHits <= 0) {
            log.warn("ReturnEsRepository.queryPage response find not hits;param={}", param);
            return PageResp.wrap(0, 0, Collections.emptyList());
        }
        List<ReturnEsDO> list = new ArrayList<>();
        for (SearchHit hit : result.getHits()) {
            ReturnEsDO esDO = JSON.parseObject(hit.getSourceAsString(), ReturnEsDO.class);
            list.add(esDO);
        }
        return PageResp.wrap(totalHits, this.calculateTotalPage(totalHits, param.getPageSize()), list);
    } catch (Exception e) {
        log.error("ReturnEsRepository.queryPage occur error;param={}", param, e);
        return PageResp.wrap(0, 0, Collections.emptyList());
    }
}

## 新增文档
public void save(ReturnEsDO returnEsDO) {
    try {
        IndexRequest indexRequest = new IndexRequest(index, type, returnEsDO.getReturnId()).source(JSON.toJSONString(returnEsDO), XContentType.JSON);
        IndexResponse response = this.restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        log.info("ReturnEsRepository.save success;param={},response={}", returnEsDO, response);
    } catch (Exception e) {
        log.error("ReturnEsRepository.save occur error;returnEsDO={}", JSON.toJSONString(returnEsDO), e);
    }
}

## 批量新增文档
public void batchSave(List<ReturnEsDO> esDOList) {
    try {
        BulkRequest request = new BulkRequest();
        for (ReturnEsDO esDO : esDOList) {
            IndexRequest indexRequest = new IndexRequest(index, type, esDO.getReturnId()).source(JSON.toJSONString(esDO), XContentType.JSON);
            request.add(indexRequest);
        }
        BulkResponse response = this.restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        log.info("ReturnEsRepository.batchSave success;response={}", response);
    } catch (Exception e) {
        log.error("ReturnEsRepository.batchSave occur error;param={}", JSON.toJSONString(esDOList), e);
    }
}
## 删除文档
public void delete(String returnId) {
    try {
        DeleteRequest request = new DeleteRequest(index, type, returnId);
        DeleteResponse response = this.restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        log.info("ReturnEsRepository.delete success;returnId={},response={}", returnId, response);
    } catch (Exception e) {
        log.error("ReturnEsRepository.delete occur error;returnId={}", returnId, e);
    }
}

## 更新文档
public void update(ReturnEsDO returnEsDO) {
    try {
        UpdateRequest updateRequest = new UpdateRequest()
                .index(index)
                .type(type)
                .id(returnEsDO.getReturnId())
                .doc(this.buildUpdateDoc(returnEsDO));
        UpdateResponse response = this.restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        log.info("ReturnEsRepository.update end;param={},response={}", returnEsDO, response);
    } catch (Exception e) {
        log.error("ReturnEsRepository.update occur error;param={}", returnEsDO, e);
    }
}

三、容易踩到的坑

1.ElasticSearchTemplate方式端口问题

ElasticSearchTemplate通过tcp协议访问ES,端口默认是9300,容易写成9200(http访问端口)。

2.ElasticSearchTemplate分页查询问题

ElasticSearchTemplate#queryForPage分页查询从第0页开始,如果和mysql分页查询一样从第1页开始容易查不到数据。

3.Amazon Elasticsearch Service不支持tcp协议

如果公司用的是AWS提供的ES服务,那么在开发之前一定要确认好,因为Amazon的ES服务压根不支持tcp协议访问,所以Jpa和ElasticSearchTemplate这两种实现完全失效,如果一不小心在开发和测试环境都是用这两种方式编码和测试,那么很不幸,代码重写切换成RestClient或者高亮RestClient。

4.RestHighLevelClient端口问题

虽然RestHighLevelClient通过http方式访问ES,但是有的ES服务可能是http也可能是https,在配置host和端口的时候一定要注意,http默认端口是80,https默认端口是443,否则会出现服务连不上或者节点找不到等一系列问题。

5.RestHighLevelClient分页问题

RestHighLevelClient分页查询通过from和size属性指定,需要注意的是这里的from不是mysql查询中的pageNumber,而是类似offset起始位点,如果设置成查询页码,会出现查询数据错乱的问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PersistentCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
双击666
双击666
回复回复点赞举报
666
666
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Springboot接入ES
详细见https://cloud.tencent.com/developer/article/2312482
翰墨飘香
2023/08/16
4860
SpringBoot集成ES-7.8
程序员 NEO
2023/10/01
2810
SpringBoot集成ES-7.8
SpringBoot整合elasticsearch集群
原文首发于CSDN:https://maoli.blog.csdn.net/article/details/104332506
润森
2020/02/25
2.1K0
SpringBoot整合elasticsearch集群
SpringBoot集成ES-6.8
在elasticsearch官网中提供了各种语言的客户端(也就是用来连接ES,用来操作ES的)
程序员 NEO
2023/10/01
3340
SpringBoot集成ES-6.8
spingboot2 整合ES7.2
包括中文分词:https://www.jianshu.com/p/d2afc19cafbd
用户5927264
2020/07/21
5650
【ES三周年】- 使用JavaAPI操作elasticsearch
工程准备创建maven工程并引入Elasticsearch相关依赖: <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.8.0</version> </dependency> <!-- elasticsearch 的客户端 --> <dep
用户6044099
2023/02/25
3060
Elasticsearch 7.6.1学习(五)springboot集成es使用,实现增删改查,并且分析源码
我们在项目里面导入es的依赖之后,就要使用人家es里面的类,这个类是人家es定义的,我们拿来使用就行。那么这个es框架有多少自己的类可以让我们使用呢?
一写代码就开心
2021/03/02
2.4K0
Elasticsearch 7.6.1学习(五)springboot集成es使用,实现增删改查,并且分析源码
ElasticSearch Java整合
Elasticsearch 软件是由 Java 语言开发的,所以也可以通过 Java API 的方式对 Elasticsearch 服务进行访问
用户9615083
2022/12/25
7100
ElasticSearch Java整合
Spring Boot(三)集成ElasticSearch
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框 架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可 见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK 的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出 到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好 的页面展示出来,提供实时分析的功能。 市面上很多开发只要提到ELK能够一致说出它是一个日志分析架构技术栈总称,但实际上ELK不仅仅适用 于日志分析,它还可以支持其它任何数据分析和收集的场景,日志分析和收集只是更具有代表性。并非 唯一性。
HcodeBlogger
2020/07/14
1.3K0
Spring Boot(三)集成ElasticSearch
Elasticsearch硬核入门教程(2022最全)
The Elastic Stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
小熊学Java
2023/07/16
3.1K0
Elasticsearch硬核入门教程(2022最全)
如何利用 SpringBoot 在 ES 中实现类似连表的查询?
那么问题来了,我们如何在后端通过技术方式快速的实现 es 中内嵌对象的数据查询呢?
Java极客技术
2022/12/04
4.7K0
Spring Boot 集成 Elasticsearch 实战
最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用,今天就讲解下如何使用 Spring Boot 结合 ES。
武培轩
2020/08/10
1.3K0
elasticsearch搜索引擎的常用方法
第一个:就是画圆,直线到达,看看距离够不够 第二个:一个正方形,根据2个点,画一个正方形,里面的数据全给拿出来 第三个:多个点,画图,图里面的数据全给你拿出来
蚊子.
2023/08/10
2110
elasticsearch搜索引擎的常用方法
【ES三周年】吊打Elasticsearch 和Java API(进阶保姆级教程-3)
上一篇我们通过kibana的可视化界面,对es的索引以及文档的常用操作做了毕竟详细的总结,本篇将介绍如何使用java完成对es的操作,这也是实际开发中将要涉及到的。
北京-宏哥
2023/04/12
20.4K1
【ES三周年】吊打Elasticsearch 和Java API(进阶保姆级教程-3)
ElasticSearch客户端调用
在elasticsearch官网中提供了各种语言的客户端:https://www.elastic.co/guide/en/elasticsearch/client/index.html
兜兜转转
2023/03/29
3.4K0
ElasticSearch客户端调用
中间件:ES组件RestHighLevelClient用法详解
RestHighLevelClient的API作为ElasticSearch备受推荐的客户端组件,其封装系统操作ES的方法,包括索引结构管理,数据增删改查管理,常用查询方法,并且可以结合原生ES查询原生语法,功能十分强大。
知了一笑
2021/02/08
13.6K0
Spring Boot整合分布式搜索引擎ElasticSearch 实现相关基本操作
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
百思不得小赵
2022/12/20
6100
Spring Boot整合分布式搜索引擎ElasticSearch 实现相关基本操作
springboot集成elasticsearch7.2
上篇文章我们讲解了elasticsearch的安装,这次我们来搞一下,如何在自己的项目中集成elasticsearch。 正常来讲spring-data中都会提供相应的starter,让我们方便的使用各种Template操作对应的组件,比如常用RedisTemplate, JdbcTemplate等,其实spring-data中也提供的相应的elasticsearch的对应工具。但是我这里并没有使用,而是直接使用的elasticsearch原生api实现的。为什么这么做呢,因为spring-data-elasticsearch 最新的版本3.2,最高支持的elasticsearch版本为6.8, 而我们用的是7.2的版本,并且官方建议我们使用的jar版本最好和软件版本一致。
一缕82年的清风
2021/12/06
7090
springboot集成elasticsearch7.2
ElasticSearch系列-SpringBoot整合
聚合:英文为Aggregation,是es除搜索功能外提供的针对es数据做统计分析的功能。聚合有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。
架构狂人
2023/09/21
3120
ElasticSearch系列-SpringBoot整合
ELK专栏之Java API操作-02
● ES技术比较特殊,不像其他分布式、大数据方便的技术,比如Hadoop、Spark和Habase等。ES代码层面很好写,难的是概念的理解。
大忽悠爱学习
2022/09/28
6360
ELK专栏之Java API操作-02
相关推荐
Springboot接入ES
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文