前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【ES三周年】SpringBoot整合elasticsearch存储抖音短视频数据实践

【ES三周年】SpringBoot整合elasticsearch存储抖音短视频数据实践

原创
作者头像
悟空码字
修改于 2023-03-20 07:29:45
修改于 2023-03-20 07:29:45
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是小悟

ElasticSearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据

Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。

人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。

这篇内容主要来说说SpringBoot整合elasticsearch存储抖音短视频数据,使得查询海量视频数据变得又快又顺畅。通过接口获取到抖音短视频数据时,调用save方法存储到elasticsearch。然后前端再调用pageQuery方法查询数据回显。

1、pom文件

引入elasticsearch依赖

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

2、Config文件

SpringBoot方便的地方就是在于可以自动装配,几个注解就搞定了传统SSM那种繁琐的xml配置,@Configuration,@AutoConfigureBefore,@EnableCaching。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@AutoConfigureBefore(RedisConfig.class)
@EnableCaching
public class ElasticConfig {
    @PostConstruct
    void init() {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
    }
    @Bean(name = "elasticsearchTemplate")
    public ElasticsearchTemplate elasticsearchTemplate(Client client,
                                                       ElasticsearchConverter converter) {
        try {
            return new ElasticsearchTemplate(client, converter);
        }
        catch (Exception ex) {
            throw new IllegalStateException(ex);
        }
    }
    @Bean
    public ElasticsearchConverter elasticsearchConverter(
            SimpleElasticsearchMappingContext mappingContext) {
        return new MappingElasticsearchConverter(mappingContext);
    }
    @Bean
    public SimpleElasticsearchMappingContext mappingContext() {
        return new SimpleElasticsearchMappingContext();
    }
}

注意,如果你的项目已经配置了redis,务必给AutoConfigureBefore这个注解传一个你的redis配置类,告诉spring,要在redis配置前先配置装载Elastic,否则会报错。

3、application.yml文件

在application.yml文件写以下几行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 data:
    elasticsearch:
      cluster-name: xxx-elastic
      cluster-nodes: 服务器ip地址:9300

注意,cluster-name的值要和config/elasticsearch.yml里面写的一致,如果config/elasticsearch.yml里面network.host是0.0.0.0,那么表示可以让任何计算机节点访问到。配置文件里端口是9200,这边是9300,这是因为9200是http访问的端口,9300是Java访问的端口,切记不要写错了哦。

做完elasticsearch的基本配置后,就可以尽情的撸接口了。

4、Repository

创建Repository,继承ElasticsearchRepository,类似jpa。这样简单的CRUD就有了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface EsHotSentenceVideoRepository extends ElasticsearchRepository<HotSentenceVideoEntity,Long> {
}

5、接口Service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface EsHotSentenceVideoService {
    HotSentenceVideoEntity save(HotSentenceVideoEntity entity);
    void delete(HotSentenceVideoEntity entity);
    void deleteAll();
    Iterable<HotSentenceVideoEntity> getAll();
    List<HotSentenceVideoEntity> getByTitle(String title);
    Page<HotSentenceVideoEntity> pageQuery(Integer pageNo, Integer pageSize);
    Page<HotSentenceVideoEntity> pageQuery(Integer pageNo, Integer pageSize, String keyWord,String startTime,String endTime);
}

6、实现类ServiceImpl

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service("esHotSentenceVideoService")
public class EsHotSentenceVideoServiceImpl implements EsHotSentenceVideoService {

    @Autowired
    private EsHotSentenceVideoRepository esHotSentenceVideoRepository;

    @Override
    public HotSentenceVideoEntity save(HotSentenceVideoEntity entity) {
        return esHotSentenceVideoRepository.save(entity);
    }

    @Override
    public void delete(HotSentenceVideoEntity entity) {
        esHotSentenceVideoRepository.delete(entity);
    }

    @Override
    public void deleteAll() {
        esHotSentenceVideoRepository.deleteAll();
    }

    @Override
    public Iterable<HotSentenceVideoEntity> getAll() {
        return esHotSentenceVideoRepository.findAll();
    }

    @Override
    public List<HotSentenceVideoEntity> getByTitle(String title) {
        List<HotSentenceVideoEntity> list = new ArrayList<>();
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", title);
        Iterable<HotSentenceVideoEntity> iterable = esHotSentenceVideoRepository.search(matchQueryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }

    @Override
    public Page<HotSentenceVideoEntity> pageQuery(Integer pageNo, Integer pageSize) {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withPageable(PageRequest.of(pageNo, pageSize))
                .build();
        return esHotSentenceVideoRepository.search(searchQuery);
    }

    /**
     * @param pageNo
     * @param pageSize
     * @param keyWord
     * @param startTime
     * @param endTime
     * @return
     */
    @Override
    public Page<HotSentenceVideoEntity> pageQuery(Integer pageNo, Integer pageSize, String keyWord,String startTime,String endTime) {
        Pageable pageable = PageRequest.of(pageNo, pageSize);
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        //分页
        nativeSearchQueryBuilder.withPageable(pageable);
        //过滤
        if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            Long startTimeLong = DateUtils.strToLong(startTime);
            Long endTimeLong = DateUtils.strToLong(endTime);
            boolQueryBuilder.must(QueryBuilders.rangeQuery("publicTime").from(startTimeLong).to(endTimeLong));
            nativeSearchQueryBuilder.withFilter(boolQueryBuilder);
        }
        //搜索
        if (StringUtils.isNotEmpty(keyWord)) {
            nativeSearchQueryBuilder.withQuery(QueryBuilders.matchPhraseQuery("sentence",keyWord));
        }
        nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort("diggCount").order(SortOrder.DESC));
        NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
        return esHotSentenceVideoRepository.search(searchQuery);
    }
}

7、总结

查询速度,一个字,快,两个字,很快,三个字,超级快,优越性不仅体现在速度上,更值得一提的是ES还可以做分词检索,很方便。

您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ElasticSearchRepository和ElasticSearchTemplate的使用
Spring-data-elasticsearch是Spring提供的操作ElasticSearch的数据层,封装了大量的基础操作,通过它可以很方便的操作ElasticSearch的数据。
天涯泪小武
2019/01/17
9.6K2
Elasticsearch项目实战,商品搜索功能设计与实现!
在SpringBoot中使用Elasticsearch本文不再赘述,直接参考《mall整合Elasticsearch实现商品搜索》即可。这里需要提一下,对于需要进行中文分词的字段,我们直接使用@Field注解将analyzer属性设置为ik_max_word即可。
macrozheng
2020/04/24
3.9K0
Spring Boot & ES 实战,值得参考!
Spring Boot 2.0.5默认的elasticsearch版本很低,这里我们用最新版本6.4.1
Java技术栈
2019/09/16
3.5K0
Spring Boot & ES 实战,值得参考!
Elasticsearch学习(六)手把手教你用Java操作Elaticsearch, 教你学会ElasticsearchTemplate的使用
使用Spring Data 下二级子项目Spring Data Elasticsearch进行操作。支持POJO方法操作Elasticsearch。相比Elasticsearch提供的API更加简单更加方便。
一写代码就开心
2021/03/02
1.9K0
Elasticsearch学习(六)手把手教你用Java操作Elaticsearch, 教你学会ElasticsearchTemplate的使用
Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!
二哥聊运营工具
2021/12/17
1.4K0
😊SpringBoot 整合 Elasticsearch (超详细).md
用户7630333
2023/12/07
2.9K0
😊SpringBoot 整合 Elasticsearch (超详细).md
ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch
本节主要介绍SpringBoot与ElasticSearch的整合,并实现简单的CRUD。
张申傲
2020/09/03
1.6K0
Spring Boot 2.0 整合 ES 5 文章内容搜索实战
阅读时间:8 分钟 摘录:人这一辈子,得到多少是多,怎样是过得好或者不好,其实并没有定义,关键你自己心里是怎么想的,要的太多,就不会幸福
二哥聊运营工具
2021/12/17
5400
五分钟在springboot中集成Elasticsearch
Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎,它使您可以快速,近乎实时地存储,搜索和分析大量数据,能够解决越来越多不同的应用场景。
方志朋
2022/01/06
1.9K0
五分钟在springboot中集成Elasticsearch
SpringBoot整合elasticsearch
在这一篇文章开始之前,你需要先安装一个ElasticSearch,如果你是mac或者linux可以参考https://www.jianshu.com/p/e47b451375ea,如果是windows可以自定百度一下。 下面是官方套话介绍elasticsearch: ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业
dalaoyang
2018/06/13
8610
SpringBoot+ElasticSearch实现文档内容抽取、高亮分词、全文检索
产品希望我们这边能够实现用户上传PDF、WORD、TXT之内得文本内容,然后用户可以根据附件名称或文件内容模糊查询文件信息,并可以在线查看文件内容。
码猿技术专栏
2024/03/18
1.8K0
SpringBoot+ElasticSearch实现文档内容抽取、高亮分词、全文检索
JavaWeb项目架构之Elasticsearch日志处理系统
Elasticsearch (ES)是一个基于 Lucene 的开源搜索引擎,它不但稳定、可靠、快速,而且也具有良好的水平扩展能力,是专门为分布式环境设计的。
小柒2012
2019/12/09
9440
JavaWeb项目架构之Elasticsearch日志处理系统
ElasticSearch 工具类封装(基于ElasticsearchTemplate)
1.抽象接口定义 1 public abstract class SearchQueryEngine<T> { 2 3 @Autowired 4 protected ElasticsearchTemplate elasticsearchTemplate; 5 6 public abstract int saveOrUpdate(List<T> list); 7 8 public abstract <R> List<R> aggregati
肖哥哥
2019/01/28
6.7K0
ES-使用springData来操作es 原
1 Es 的配置文件 elasticsearch.yml http.cors.enabled: true http.cors.allow-origin: "*" network.host: 127.
用户5927264
2019/08/30
2K0
ES快速开发,ElasticsearchRestTemplate基本使用以及ELK快速部署
最近博主有一些elasticsearch的工作,所以更新的慢了些,现在就教大家快速入门,并对一些基本的查询、更新需求做一下示例,废话不多说开始:
努力的小雨
2024/06/12
8811
spring-boot-starter-data-elasticsearch整合elasticsearch 6.x实现高亮
其中elasticRepository.search(searchQuery)方法是ElasticsearchRepository接口(本文中ElasticServiceImpl 的父接口)中的方法。
程裕强
2019/05/27
2.8K0
SpringBoot连接Elasticsearch实战总结
第一次使用elasticsearch,于是从网上找轮子复制粘贴。早好轮子测试完毕,上线。可是几天下来发现接口响应时间一直都偏高(默认的超时时间是500ms),所以就不停的对代码优化,缩短时间。但是到最后代码已经不能再优化了,响应时间依然没有明显的下降趋势,甚至在高峰期会严重超时。接下来会慢慢讲解elasticsearch使用优化。
小森啦啦啦
2019/07/13
4K0
springboot整合elasticsearch 5.x 6.x 索引配置analyzer
跟随elasticsearch和ik的安装和function score query 权重分查询教程,发现权重分查询结果与预期不符,判断原因是:在查询中,ik没有生效。 (es5以后权重分查询的api也有改变,如下:
平凡的学生族
2019/05/25
1.7K0
[Springboot实战系列]整合ElasticSearch实现数据模糊搜索(Logstash同步Mysql数据)
本文介绍了如何整合搜索引擎elasticsearch与springboot,对外提供数据查询接口。
蛮三刀酱
2019/03/26
6.1K0
[Springboot实战系列]整合ElasticSearch实现数据模糊搜索(Logstash同步Mysql数据)
springboot 2.2.x +ES 7.4.x 实现分词和高亮搜索
application.properties es默认没有密码,暂时未设定用户密码
smallmayi
2022/05/12
8400
springboot 2.2.x +ES 7.4.x 实现分词和高亮搜索
推荐阅读
相关推荐
ElasticSearchRepository和ElasticSearchTemplate的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验