Elasticsearch实现词云效果Demo

文章目录

  • 前言
  • 前期准备
    • springboot+Elasticsearch依赖
  • 思路
    • 准备数据
    • 查询数据
    • 处理文本
    • 样式处理
  • 具体实施
    • 数据准备
    • 创建索引
    • 数据存储
    • 进行查询
  • 踩坑记录
    • 聚合查询不生效问题
  • demo地址
  • 总结

前言

最近项目中使用Elasticsearch在做快速查询的功能,然后就想到了之前的一个项目中有一个词云的功能,就想用Elasticsearch实现一下词云的效果,实现思路很简单,目前这个demo已经写完了,透露一下很简陋,如何想要在项目中实际应用还需要改进。

前期准备

springboot+Elasticsearch依赖

版本我用的springboot 2.3.12.RELEASE对应的Elasticsearch是7.6.2

<!--        elasticsearch相关依赖--><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency><!-- ikanalyzer 中文分词器  --><dependency><groupId>com.janeluo</groupId><artifactId>ikanalyzer</artifactId><version>2012_u6</version></dependency>

在这里插入图片描述

思路

准备数据

将需要生成词云的文本数据存储到ES中。可以将文本拆分为单个词语,并将其作为文档的字段保存到ES中。

查询数据

使用ES的查询功能检索文档数据。可以根据业务需求编写查询语句,以获取需要的文本数据。

处理文本

将查询到的文本数据进行处理,例如去除停用词、统计词频等。

样式处理

这个不在本文章的范畴内,在上面的步骤就已经简单的实现一部分高频词的内容了,所以下面的这些是属于具体业务了,本文只提供一个思路和demo

  • 选择关键词:根据需求,可以根据词频进行排序,选择一定数量的高频词作为关键词。

  • 生成词云:使用词云生成工具库(如WordCloud)来生成词云图像。根据关键词的频率和重要性,在画布上布局词语,并设置相应的颜色、字体等样式。

  • 展示词云:将生成的词云图像展示在前端页面或保存为图片文件。如果在网页中展示,可以使用HTML和CSS来控制布局和样式。

具体实施

数据准备

就是单纯的准备数据阶段,使用下面这个数据中的数据随机生成一些句子,然后再使用Ik的工具包进行分词,分词以后存储到ES中

    static  final String[] CHINESE_WORDS = {"我", "你", "他", "她", "它","是", "的", "在", "这", "那","很", "真", "爱", "喜欢","美丽", "快乐", "拥抱", "友情", "理解","幸福", "梦想", "努力", "成功", "明天","希望", "勇气", "坚定", "自信", "感恩","热爱", "青春", "成长", "智慧", "创新","开心", "失落", "放弃", "挑战", "困难","奋斗", "拼搏", "汗水", "收获", "感动","祝福", "寂寞", "无聊", "闲暇", "旅游","信任", "包容", "尊重", "宽容", "耐心"};/*** @description: 使用IK对这些句子进行分词* @author: gepengjun* @date: 2023/9/8 10:09* @param: []* @return: java.util.List<java.lang.String>**/List<String> fenci() throws IOException {String text = "我喜欢使用IK分词器进行中文分词。";List<String> strings = generateRandomChineseSentences(20);String context="";for (String string : strings) {context+=string;}List<String> lists=new ArrayList<>();try (StringReader reader = new StringReader(context)) {IKSegmenter segmenter = new IKSegmenter(reader, true);Lexeme lexeme;while ((lexeme = segmenter.next()) != null) {System.out.println(lexeme.getLexemeText());lists.add(lexeme.getLexemeText());}} catch (IOException e) {e.printStackTrace();}return lists;}/*** @description: 生成句子的* @author: gepengjun* @date: 2023/9/8 10:09* @param: [numSentences]生成多少条* @return: java.util.List<java.lang.String>**/private static List<String> generateRandomChineseSentences(int numSentences) {List<String> sentences = new ArrayList<>();Random random = new Random();for (int i = 0; i < numSentences; i++) {int numWords = random.nextInt(10) + 5; // 每个句子包含的词语数量范围为 5-14StringBuilder sb = new StringBuilder();for (int j = 0; j < numWords; j++) {int index = random.nextInt(CHINESE_WORDS.length);sb.append(CHINESE_WORDS[index]);}String sentence = sb.toString();sentences.add(sentence);}return sentences;}

创建索引

存储数据前要先创建索引,在ES中索引你可以理解为数据库中的表

    @Testvoid createIndex(){// 创建ES连接RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("116.204.118.226", 9200, "http")));try {// 创建索引请求CreateIndexRequest request = new CreateIndexRequest("wordcloud");//简单理解就是建表// 设置索引的设置request.settings(Settings.builder().put("index.number_of_shards", 1).put("index.number_of_replicas", 1));// 设置索引的映射XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("properties").startObject("context") //建表字段的过程.field("type", "text").startObject("keyword") // 添加一个名为 "keyword" 的子字段.field("type", "keyword") // 子字段类型为 keyword.endObject().endObject().endObject().endObject();request.mapping("_doc",mapping);// 发送创建索引请求client.indices().create(request, RequestOptions.DEFAULT);System.out.println("索引创建成功!");} catch (IOException e) {e.printStackTrace();} finally {// 关闭ES连接try {client.close();} catch (IOException e) {e.printStackTrace();}}}

注意这里,后面会用到
在这里插入图片描述

数据存储

注意我这些操作都是在单元测试中进行的

    @Testvoid insertData() throws IOException {// 创建一个 RestHighLevelClient 对象,用于与 Elasticsearch 进行通信RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 创建一个 BulkRequest 对象,用于批量操作请求BulkRequest request = new BulkRequest();// 调用 fenci() 方法获取分词结果列表List<String> strings = fenci();// 遍历分词结果列表,将每个分词作为一个文档添加到 BulkRequest 中for (String word: strings) {// 创建一个 IndexRequest 对象,并指定要添加到的索引名称和文档内容request.add(new IndexRequest("wordcloud").source("context", word));}// 执行批量操作请求,并获取响应BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);if (response.hasFailures()) {// 处理错误情况System.out.println("添加失败---------------------");} else {// 处理成功情况System.out.println("添加成功");}}

进行查询

这里使用了es的聚合查询,查询该索引下出现频率最高的前20个单词

    @Testvoid wrodCloud(){// 创建ES连接RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));try {// 构建搜索请求SearchRequest request = new SearchRequest("wordcloud");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchAllQuery());sourceBuilder.size(0); // 设置为0以仅返回聚合结果sourceBuilder.timeout(TimeValue.timeValueMinutes(1));// 添加词频统计的聚合sourceBuilder.aggregation(AggregationBuilders.terms("word_count").field("context.keyword").size(20)); // 返回频率最高的 20 个词语request.source(sourceBuilder);// 执行搜索请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);ParsedStringTerms wordCount = response.getAggregations().get("word_count");for (Terms.Bucket bucket : wordCount.getBuckets()) {String word = bucket.getKeyAsString();long frequency = bucket.getDocCount();System.out.println("热门单词:"+word);System.out.println("出现次数:"+frequency);System.out.println("——————————————————————————————");}} catch (IOException e) {e.printStackTrace();} finally {// 关闭ES连接try {client.close();} catch (IOException e) {e.printStackTrace();}}}

可以看到查询出来了20个单词,以及出现的频率,这样我们将这些单词以及频率进行一些简单的处理就能获得它们的占比,然后返回到前端展示,至于前端要使用什么用的控件或者框架是另一回事了,因为这些数据是准备好的。
在这里插入图片描述

踩坑记录

聚合查询不生效问题

这个问题就是上面创建索引中截图圈出来的部分,就是当我们对文本类型的数据进行聚合查询是需要设置它的子字段有一个keywrod类型的,然后在查询的时候指定这个(字段名.子字段名),这种方式就能正常的使用es的聚合查询了。
在 Elasticsearch 中,当需要对文本类型的字段进行聚合查询时,需要使用额外的 “keyword” 类型的子字段。这样做的目的是为了将文本数据转换为可进行聚合操作的结构。

设置 “keyword” 子字段的步骤如下:

  1. 创建索引时,在字段的映射中为文本字段添加一个子字段。
  2. 子字段的类型设置为 “keyword”,表示它是一个非分词的字符串类型。
  3. 可以为子字段指定任意的名称,不一定非得叫 “keyword”。

通过将字段的类型设置为 “keyword”,Elasticsearch 将保存原始文本数据,并允许对该子字段进行精确的分组统计操作,实现对文本字段的聚合查询。

demo地址

Demo地址

总结

关于使用这个es实现的这个效果,个人认为这只是一种方案,还有其它的,这里是直接使用的分词工具包,es上还可以安装分词插件,所以我的这种不一定是最好的,这是一种简单的方案希望大家不要被我的这种给迷惑了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9月1日作业

思维导图 服务器代码 #include<myhead.h>#define PORT 4567 #define IP "192.168.6.225"struct msg //接收到的客户端信息结构体 {char type;char name[20];char txt[128]; };//定义节点类型 typedef struct Node {union{struct sockaddr_in cin; //数据…

SpringMVC增删改查(CRUD)的实现

目录 前言 一、前期准备 1.pom.xml---依赖与插件的导入 2.jdbc.properties---数据库连接 3.log4j2.xml---日志文件 4.spring-mybatis---mybatis与spring整合文件 5.spring-context---spring上下文配置 6.spring-mvc 7.generatorConfig.xml---代码生成器 8.web.xml 二…

核心实验16_端口镜像_ENSP

项目场景&#xff1a; 核心实验16_端口镜像_ENSP 实搭拓扑图&#xff1a; 具体操作&#xff1a; 交换机: [garliccc]observe-port 1 interface GigabitEthernet 0/0/3 /设置0/0/3为观察口 [garliccc]int g0/0/2 [garliccc-GigabitEthernet0/0/2]port-mirroring to observe-po…

win 10 安装新程序总是弹出提示:目前无法访问smartscreen

win 10 安装新程序总是弹出提示&#xff1a;目前无法访问smartscreen 因为后来无法再现警告&#xff0c;无法截图 搜索安全&#xff0c;找到 Windows 安全中心 找到“应用和浏览器控制”&#xff0c;关闭其中 2 项 SmartScreen 奇怪的是&#xff0c;之后我又改回去了&#x…

npm install失败的分析与解决方案,以及修复完成的代码地址

问题描述&#xff1a; 在引入vue-element-admin后npm i 初始化失败&#xff0c;或者对下载的vue项目npm i 任何插件都会失败&#xff0c;且安装依赖时报错 npm ERR! Error while executing npm ERR! Error while executing: npm ERR! H:\Program Files\git\Git\cmd\git.EXE ls…

接口测试(详细总结)

序章 ​ 说起接口测试&#xff0c;网上有很多例子&#xff0c;看了不不知道他们说的什么&#xff0c;觉得接口测试&#xff0c;好高大上。认为学会了接口测试就能屌丝逆袭&#xff0c;走上人生巅峰&#xff0c;迎娶白富美。因此学了点开发知识后&#xff0c;发现接口测试其实都…

第P4周:猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;Pytorch实战 | 第P4周&#xff1a;猴痘病识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、前期准备 1.设置GPU 设置GPU device torch.device…

系统架构设计师-嵌入式系统

目录 一、嵌入式系统概述 1、基本概念 2、嵌入式系统软件组成架构 二、嵌入式软件开发 三、嵌入式硬件 1、嵌入式微处理器 2、人工智能芯片 3、嵌入式微处理器体系结构 4、总线 四、嵌入式操作系统 1、嵌入式实时操作系统 2、操作系统内核架构 3、鸿蒙操作系统 五、嵌入式…

postman token 请求头添加

思路&#xff1a; 1、登录成功后将 得到的token设置为集合变量 2、在需要携带Authorization的请求头上使用该集合变量 关键代码 const responseData pm.response.json(); if(responseData.code 1) {// 获取tokenconst {data:{token}} responseData// 设置为集合变量pm.colle…

编译OpenWrt内核驱动

编译OpenWrt内核驱动可以参考OpenWrt内部其它驱动的编写例程&#xff0c;来修改成自己需要的驱动 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码&#xff1a; git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update -…

vue中如何给特殊字段设置插槽

大纲: <template><div><div><span>卡号</span><el-input type"text" v-model"cardNo" clearable placeholder"请输入卡号" /><el-button type"primary" plain icon"el-icon-search"…

我们如何在工作与生活中找到平衡点?

找到工作与生活中的平衡点是每个人都必须面对的问题。以下是一些建议&#xff0c;可以帮助你在工作和生活之间找到平衡&#xff1a; 制定时间表&#xff1a;确保你有足够的时间来处理工作和生活中的各种任务。为工作、学习和个人生活设定优先级&#xff0c;并确保时间分配合理…

ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案

ElasticSearch第三讲&#xff1a;ES详解 - Elastic Stack生态和场景方案 本文是ElasticSearch第三讲&#xff0c;在了解ElaticSearch之后&#xff0c;我们还要了解Elastic背后的生态 即我们常说的ELK&#xff1b;与此同时&#xff0c;还会给你展示ElasticSearch的案例场景&…

浅谈限流式保护器在高校防火工作的应用

安科瑞 华楠 【摘要】摘要&#xff1a;为了预防火灾和减少火灾带来的危害&#xff0c;保护校园和师生生命财产安全&#xff0c; 建和谐安宁的校园环境&#xff0c;保障学校安全稳定发展&#xff0c;我们必须要时刻拧紧消防安全这弦&#xff0c;时刻注意这根高压线。随着近年来…

el-select下拉框定位问题

1.当el-select所在页面滚动时或者el-select上面区域高度发生变化时&#xff0c;定位存在偏差 2.解决办法&#xff1a; 1. el-select自带属性popper-append-to-body&#xff1a;true&#xff0c;可能会无效 2.设置ref,监听高度变化或者滚动时&#xff0c;手动执行刷新方法&…

应用在汽车新风系统中消毒杀菌的UVC灯珠

在病毒、细菌的传播可以说是一个让人敏感而恐惧的事情。而对于车内较小的空间&#xff0c;乘坐人员流动性大&#xff0c;更容易残留细菌病毒。车内缺少通风&#xff0c;残留的污垢垃圾也会滋生细菌&#xff0c;加快细菌的繁殖。所以对于车内消毒就自然不容忽视。 那么问题又来…

算法:贪心---跳一跳

1、题目&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 2…

【SpringMvc 丨跨域】

Spring MVC 支持跨域处理&#xff08;CORS&#xff09;。 CORS 简介处理CORS 过滤器CrossOrigin注解java配置xml配置 主页传送门&#xff1a;&#x1f4c0; 传送 简介 跨域是指在浏览器的同源策略下&#xff0c;不能执行其他网站的脚本。它是由浏览器的安全限制造成的&#xf…

2023-9-12 完全背包问题

题目链接&#xff1a;完全背包问题 初版(时间复杂度拉满) #include <iostream> #include <algorithm>using namespace std;const int N 1010;int n, m; int v[N], w[N]; int f[N][N];int main() {cin >> n >> m;for(int i 1; i < n; i ) cin >…

欧洲汽车制造商押注电力合成燃料 | 2023中国可持续燃料峰会

欧洲几家汽车制造商表示&#xff0c;所谓的电力合成燃料(e-fuels&#xff0c;利用可再生电力合成的化石燃料&#xff0c;又称电子燃料)将在欧洲汽车行业的未来发挥关键作用&#xff0c;它们相信&#xff0c;布鲁塞尔方面在替代燃料问题上的让步&#xff0c;将使它们能够在未来1…