【ES三周年】万字长文带你实战 Elasticsearch 搜索 信息
ES 高级实战
前言
上篇我们讲到了 Elasticsearch 全文检索的原理《别只会搜日志了,求你懂点原理吧》,通过在本地搭建一套 ES 服务,以多个案例来分析了 ES 的原理以及基础使用。这次我们来讲下 Spring Boot 中如何整合 ES,以及如何在 Spring Cloud 微服务项目中使用 ES 来实现全文检索,来达到搜索题库的功能。
而且题库的数据量是非常大的,题目的答案也是非常长的,通过 ES 正好可以解决 mysql 模糊搜索的低效性。
通过本实战您可以学到如下知识点:
【资料图】
本篇主要内容如下:
本文案例都是基于 PassJava 实战项目来演示的。
:+1:Github 地址:https://github.com/Jackson0714/PassJava-Platform
一、Elasticsearch 组件库介绍
在讲解之前,我在这里再次提下全文检索是什么:
全文检索:指以全部文本信息作为检索对象的一种信息检索技术。而我们使用的数据库,如 Mysql,MongoDB 对文本信息检索能力特别是中文检索并没有 ES 强大。所以我们来看下 ES 在项目中是如何来代替 SQL 来工作的。
我使用的 Elasticsearch 服务是 7.4.2 的版本,然后采用官方提供的 Elastiscsearch-Rest-Client 库来操作 ES,而且官方库的 API 上手简单。
该组件库的官方文档地址:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html
另外这个组件库是支持多种语言的:
注意:Elasticsearch Clients
就是指如何用 API 操作 ES 服务的组件库。
可能有同学会提问,Elasticsearch 的组件库中写着 JavaScript API,是不是可以直接在前端访问 ES 服务?可以是可以,但是会暴露 ES 服务的端口和 IP 地址,会非常不安全。所以我们还是用后端服务来访问 ES 服务。
我们这个项目是 Java 项目,自然就是用上面的两种:Java Rest Client
或者 Java API
。我们先看下 Java API,但是会发现已经废弃了。如下图所示:
所以我们只能用 Java REST Client 了。而它又分成两种:高级和低级的。高级包含更多的功能,如果把高级比作MyBatis的话,那么低级就相当于JDBC。所以我们用高级的 Client。
二、整合检索服务
我们把检索服务单独作为一个服务。就称作 passjava-search 模块吧。
1.1 添加搜索服务模块
创建 passjava-search 模块。首先我们在 PassJava-Platform 模块创建一个 搜索服务模块 passjava-search。然后勾选 spring web 服务。如下图所示。
第一步:选择 Spring Initializr,然后点击 Next。
第二步:填写模块信息,然后点击 Next。
第三步:选择 Web->Spring Web 依赖,然后点击 Next。
1.2 配置 Maven 依赖
参照 ES 官网配置。进入到 ES 官方网站,可以看到有低级和高级的 Rest Client,我们选择高阶的(High Level Rest Client)。然后进入到高阶 Rest Client 的 Maven 仓库。官网地址如下所示:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/index.html
对应文件路径:\passjava-search\pom.xml
org.elasticsearch.client elasticsearch-rest-high-level-client 7.4.2
配置 elasticsearch 的版本为7.4.2因加上 Maven 依赖后,elasticsearch 版本为 7.6.2,所以遇到这种版本不一致的情况时,需要手动改掉。
对应文件路径:\passjava-search\pom.xml
7.4.2
刷新 Maven Project 后,可以看到引入的 elasticsearch 都是 7.4.2 版本了,如下图所示:
Common 模块是 PassJava 项目独立的出来的公共模块,引入了很多公共组件依赖,其他模块引入 Common 模块依赖后,就不需要单独引入这些公共组件了,非常方便。
对应文件路径:\passjava-search\pom.xml
com.jackson0714.passjava passjava-common 0.0.1-SNAPSHOT
添加完依赖后,我们就可以将搜索服务注册到 Nacos
注册中心了。 Nacos 注册中心的用法在前面几篇文章中也详细讲解过,这里需要注意的是要先启动 Nacos 注册中心,才能正常注册 passjava-search 服务。
1.3 注册搜索服务到注册中心
修改配置文件:src/main/resources/application.properties。配置应用程序名、注册中心地址、注册中心的命名中间。
spring.application.name=passjava-searchspring.cloud.nacos.config.server-addr=127.0.0.1:8848spring.cloud.nacos.config.namespace=passjava-search
给启动类
添加服务发现注解:@EnableDiscoveryClient
。这样 passjava-search 服务就可以被注册中心发现了。
因 Common 模块依赖数据源,但 search 模块不依赖数据源,所以 search 模块需要移除数据源依赖:
exclude = DataSourceAutoConfiguration.class
以上的两个注解如下所示:
@EnableDiscoveryClient@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)public class PassjavaSearchApplication { public static void main(String[] args) { SpringApplication.run(PassjavaSearchApplication.class, args); }}
接下来我们添加一个 ES 服务的专属配置类,主要目的是自动加载一个 ES Client 来供后续 ES API 使用,不用每次都 new 一个 ES Client。
1.4 添加 ES 配置类
配置类:PassJavaElasticsearchConfig.java
核心方法就是 RestClient.builder 方法,设置好 ES 服务的 IP 地址、端口号、传输协议就可以了。最后自动加载了 RestHighLevelClient。
package com.jackson0714.passjava.search.config;import org.apache.http.HttpHost;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @Author: 公众号 | 悟空聊架构 * @Date: 2020/10/8 17:02 * @Site: www.passjava.cn * @Github: https://github.com/Jackson0714/PassJava-Platform */@Configurationpublic class PassJavaElasticsearchConfig { @Bean // 给容器注册一个 RestHighLevelClient,用来操作 ES // 参考官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/java-rest-high-getting-started-initialization.html public RestHighLevelClient restHighLevelClient() { return new RestHighLevelClient( RestClient.builder( new HttpHost("192.168.56.10", 9200, "http"))); }}
接下来我们测试下 ES Client 是否自动加载成功。
1.5 测试 ES Client 自动加载
在测试类 PassjavaSearchApplicationTests 中编写测试方法,打印出自动加载的 ES Client。期望结果是一个 RestHighLevelClient 对象。
package com.jackson0714.passjava.search;import org.elasticsearch.client.RestHighLevelClient;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass PassjavaSearchApplicationTests { @Qualifier("restHighLevelClient") @Autowired private RestHighLevelClient client; @Test public void contextLoads() { System.out.println(client); }}
运行结果如下所示,打印出了 RestHighLevelClient。说明自定义的 ES Client 自动装载成功。
1.6 测试 ES 简单插入数据
测试方法 testIndexData,省略 User 类。users 索引在我的 ES 中是没有记录的,所以期望结果是 ES 中新增了一条 users 数据。
/** * 测试存储数据到 ES。 * */@Testpublic void testIndexData() throws IOException { IndexRequest request = new IndexRequest("users"); request.id("1"); // 文档的 id //构造 User 对象 User user = new User(); user.setUserName("PassJava"); user.setAge("18"); user.setGender("Man"); //User 对象转为 JSON 数据 String jsonString = JSON.toJSONString(user); // JSON 数据放入 request 中 request.source(jsonString, XContentType.JSON); // 执行插入操作 IndexResponse response = client.index(request, RequestOptions.DEFAULT); System.out.println(response);}
执行 test 方法,我们可以看到控制台输出以下结果,说明数据插入到 ES 成功。另外需要注意的是结果中的 result 字段为 updated,是因为我本地为了截图,多执行了几次插入操作,但因为 id = 1,所以做的都是 updated 操作,而不是 created 操作。
我们再来到 ES 中看下 users 索引中数据。查询 users 索引:
GET users/_search
结果如下所示:
可以从图中看到有一条记录被查询出来,查询出来的数据的 _id = 1,和插入的文档 id 一致。另外几个字段的值也是一致的。说明插入的数据没有问题。
"age" : "18","gender" : "Man","userName" : "PassJava"
1.7 测试 ES 查询复杂语句
示例:搜索 bank 索引,address 字段中包含 big 的所有人的年龄分布 ( 前 10 条 ) 以及平均年龄,以及平均薪资。
1.7.1 构造检索条件
我们可以参照官方文档给出的示例来创建一个 SearchRequest 对象,指定要查询的索引为 bank,然后创建一个 SearchSourceBuilder 来组装查询条件。总共有三种条件需要组装:
address 中包含 road 的所有人。按照年龄分布进行聚合。计算平均薪资。代码如下所示,需要源码请到我的 Github/PassJava 上下载。
将打印出来的检索参数复制出来,然后放到 JSON 格式化工具中格式化一下,再粘贴到 ES 控制台执行,发现执行结果是正确的。
用在线工具格式化 JSON 字符串,结果如下所示:
然后我们去掉其中的一些默认参数,最后简化后的检索参数放到 Kibana 中执行。
Kibana Dev Tools 控制台中执行检索语句如下图所示,检索结果如下图所示:
找到总记录数:29 条。
第一条命中记录的详情如下:
平均 balance:13136。
平均年龄:26。
地址中包含 Road 的:263 Aviation Road。
和 IDEA 中执行的测试结果一致,说明复杂检索的功能已经成功实现。
17.2 获取命中记录的详情
而获取命中记录的详情数据,则需要通过两次 getHists() 方法拿到,如下所示:
// 3.1)获取查到的数据。SearchHits hits = response.getHits();// 3.2)获取真正命中的结果SearchHit[] searchHits = hits.getHits();
我们可以通过遍历 searchHits 的方式打印出所有命中结果的详情。
// 3.3)、遍历命中结果for (SearchHit hit: searchHits) { String hitStr = hit.getSourceAsString(); BankMember bankMember = JSON.parseObject(hitStr, BankMember.class);}
拿到每条记录的 hitStr 是个 JSON 数据,如下所示:
{"account_number": 431,"balance": 13136,"firstname": "Laurie","lastname": "Shaw","age": 26,"gender": "F","address": "263 Aviation Road","employer": "Zillanet","email": "laurieshaw@zillanet.com","city": "Harmon","state": "WV"}
而 BankMember 是根据返回的结果详情定义的的 JavaBean。可以通过工具自动生成。在线生成 JavaBean 的网站如下:
https://www.bejson.com/json2javapojo/new/
把这个 JavaBean 加到 PassjavaSearchApplicationTests 类中:
@ToString@Datastatic class BankMember { private int account_number; private int balance; private String firstname; private String lastname; private int age; private String gender; private String address; private String employer; private String email; private String city; private String state;}
然后将 bankMember 打印出来:
System.out.println(bankMember);
得到的结果确实是我们封装的 BankMember 对象,而且里面的属性值也都拿到了。
1.7.3 获取年龄分布聚合信息
ES 返回的 response 中,年龄分布的数据是按照 ES 的格式返回的,如果想按照我们自己的格式来返回,就需要将 response 进行处理。
如下图所示,这个是查询到的年龄分布结果,我们需要将其中某些字段取出来,比如 buckets,它代表了分布在 21 岁的有 4 个。
下面是代码实现:
Aggregations aggregations = response.getAggregations();Terms ageAgg1 = aggregations.get("ageAgg");for (Terms.Bucket bucket : ageAgg1.getBuckets()) { String keyAsString = bucket.getKeyAsString(); System.out.println("用户年龄: " + keyAsString + " 人数:" + bucket.getDocCount());}
最后打印的结果如下,21 岁的有 4 人,26 岁的有 4 人,等等。
1.7.4 获取平均薪资聚合信息
现在来看看平均薪资如何按照所需的格式返回,ES 返回的结果如下图所示,我们需要获取 balanceAvg 字段的 value 值。
代码实现:
Avg balanceAvg1 = aggregations.get("balanceAvg");System.out.println("平均薪资:" + balanceAvg1.getValue());
打印结果如下,平均薪资 28578 元。
三、实战:同步 ES 数据
3.1 定义检索模型
PassJava 这个项目可以用来配置题库,如果我们想通过关键字来搜索题库,该怎么做呢?
类似于百度搜索,输入几个关键字就可以搜到关联的结果,我们这个功能也是类似,通过 Elasticsearch 做检索引擎,后台管理界面和小程序作为搜索入口,只需要在小程序上输入关键字,就可以检索相关的题目和答案。
首先我们需要把题目和答案保存到 ES 中,在存之前,第一步是定义索引的模型,如下所示,模型中有 title
和 answer
字段,表示题目和答案。
"id": { "type": "long"},"title": { "type": "text", "analyzer": "ik_smart"},"answer": { "type": "text", "analyzer": "ik_smart"},"typeName": { "type": "keyword"}
3.2 在 ES 中创建索引
上面我们已经定义了索引结构,接着就是在 ES 中创建索引。
在 Kibana 控制台中执行以下语句:
PUT question{"mappings" : { "properties": { "id": { "type": "long" }, "title": { "type": "text", "analyzer": "ik_smart" }, "answer": { "type": "text", "analyzer": "ik_smart" }, "typeName": { "type": "keyword" }} }}
执行结果如下所示:
我们可以通过以下命令来查看 question 索引是否在 ES 中:
GET _cat/indices
执行结果如下图所示:
3.3 定义 ES model
上面我们定义 ES 的索引,接着就是定义索引对应的模型,将数据存到这个模型中,然后再存到 ES 中。
ES 模型如下,共四个字段:id、title、answer、typeName。和 ES 索引是相互对应的。
@Datapublic class QuestionEsModel { private Long id; private String title; private String answer; private String typeName;}
3.4 触发保存的时机
当我们在后台创建题目或保存题目时,先将数据保存到 mysql 数据库,然后再保存到 ES 中。
如下图所示,在管理后台创建题目时,触发保存数据到 ES 。
第一步,保存数据到 mysql 中,项目中已经包含此功能,就不再讲解了,直接进入第二步:保存数据到 ES 中。
而保存数据到 ES 中,需要将数据组装成 ES 索引对应的数据,所以我用了一个 ES model,先将数据保存到 ES model 中。
3.5 用 model 来组装数据
这里的关键代码时 copyProperties
,可以将 question
对象的数据取出,然后赋值到 ES model 中。不过 ES model 中还有些字段是 question 中没有的,所以需要单独拎出来赋值,比如 typeName 字段,question 对象中没有这个字段,它对应的字段是 question.type,所以我们把 type 取出来赋值到 ES model 的 typeName 字段上。如下图所示:
3.6 保存数据到 ES
我在 passjava-search 微服务中写了一个保存题目的 api 用来保存数据到 ES 中。
然后在 passjava-question 微服务中调用 search 微服务的保存 ES 的方法就可以了。
// 调用 passjava-search 服务,将数据发送到 ES 中保存。searchFeignService.saveQuestion(esModel);
3.7 检验 ES 中是否创建成功
我们可以通过 kibana 的控制台来查看 question 索引中的文档。通过以下命令来查看:
GET question/_search
执行结果如下图所示,有一条记录:
另外大家有没有疑问:可以重复更新题目吗?
答案是可以的,保存到 ES 的数据是幂等的,因为保存的时候带了一个类似数据库主键的 id。
四、实战:查询 ES 数据
我们已经将数据同步到了 ES 中,现在就是前端怎么去查询 ES 数据中,这里我们还是使用 Postman 来模拟前端查询请求。
4.1 定义请求参数
请求参数我定义了三个:
keyword:用来匹配问题或者答案。id:用来匹配题目 id。pageNum:用来分页查询数据。这里我将这三个参数定义为一个类:
@Datapublic class SearchParam { private String keyword; // 全文匹配的关键字 private String id; // 题目 id private Integer pageNum; // 查询第几页数据}
4.2 定义返回参数
返回的 response 我也定义了四个字段:
questionList:查询到的题目列表。pageNum:第几页数据。total:查询到的总条数。totalPages:总页数。定义的类如下所示:
@Datapublic class SearchQuestionResponse { private List questionList; // 题目列表 private Integer pageNum; // 查询第几页数据 private Long total; // 总条数 private Integer totalPages; // 总页数}
4.3 组装 ES 查询参数
调用 ES 的查询 API 时,需要构建查询参数。
组装查询参数的核心代码如下所示:
4.4 格式化 ES 返回结果
ES 返回的数据是 ES 定义的格式,真正的数据被嵌套在 ES 的 response 中,所以需要格式化返回的数据。
核心代码如下图所示:
4.5 测试 ES 查询
4.5.1 实验一:测试 title 匹配
我们现在想要验证 title 字段是否能匹配到,传的请求参数 keyword = 111,匹配到了 title = 111 的数据,且只有一条。页码 pageNum 我传的 1,表示返回第一页数据。如下图所示:
4.5.2 实验二:测试 answer 匹配
我们现在想要验证 answer 字段是否能匹配到,传的请求参数 keyword = 测试答案,匹配到了 title = 测试答案的数据,且只有一条,说明查询成功。如下图所示:
4.5.2 实验三:测试 id 匹配
我们现在想要匹配题目 id 的话,需要传请求参数 id,而且 id 是精确匹配。另外 id 和 keyword 是取并集,所以不能传 keyword 字段。
请求参数 id = 5,返回结果也是 id =5 的数据,说明查询成功。如下图所示:
五、总结
本文通过我的开源项目 passjava 来讲解 ES 的整合,ES 的 API 使用以及测试。非常详细地讲解了每一步该如何做,相信通过阅读本篇后,再加上自己的实践,一定能掌握前后端该如何使用 ES 来达到高效搜索的目的。
当然,ES API 还有很多功能未在本文实践,有兴趣的同学可以到 ES 官网进行查阅和学习。
-
2022-09-15 14:23:06
杨莉娜租借加盟巴黎圣日耳曼 与姆巴佩梅西拉莫斯一起共事<
北京时间9月13日下午,法甲女足俱乐部巴黎圣日耳曼正式官宣中国女足国脚杨莉娜完成租借加盟,合同期至2023年6月。杨莉娜成为目前国家队中第
-
2022-02-07 14:57:45
奇迹!绝杀!女足亚洲杯逆转夺冠!<
刚刚,中国女足上演逆转绝杀奇迹!她们在亚洲杯决赛中3:2力克韩国队,时隔16年再夺亚洲杯冠军!
-
2022-02-07 14:57:45
中国政府与阿根廷共和国政府签署共建“一带一路”谅解备忘录<
新华社北京2月6日电(记者安蓓)国家发展改革委6日称,国家发展改革委主任何立峰与阿根廷外交、国际贸易和宗教事
-
2022-02-07 14:57:43
中华人民共和国和阿根廷共和国关于深化中阿全面战略伙伴关系的联合声明(全文)<
新华社北京2月6日电中华人民共和国和阿根廷共和国关于深化中阿全面战略伙伴关系的联合声明一、应中方邀请,阿根廷
-
2022-02-07 14:57:40
春节假期国内旅游出游2.51亿人次<
春节遇冬奥,旅游年味浓。根据文化和旅游部数据中心测算,2022年春节假期7天,全国国内旅游出游2 51亿人次,同比
-
2023-02-26 02:17:24
【ES三周年】万字长文带你实战 Elasticsearch 搜索 信息
上篇我们讲到了Elasticsearch全文检索的原理《别只会搜日志了,求你懂点原理吧》,通过在本地搭建一套ES服务,以多个案例来分析了ES的原理以
-
2023-02-25 21:00:33
“撞衫”?“飞天”舱外航天服竟然藏着这么多黑科技
2月24日,“逐梦寰宇问苍穹——中国载人航天工程三十年成就展”开幕,这场为期三个月的展览呈现了大量近年来围绕中国载人航天的国际合作成...
-
2023-02-25 18:39:48
中国邮政集团公司广州市分公司
1、广州市邮政分公司(简称“广州邮政“)是中国邮政集团公司广东省邮政公司属下的国有社会公用性企业,是中国邮政集团公司
-
2023-02-25 17:19:56
轻骑飞跃打三国演义中一个人名_轻骑飞跃打一三国演义人名_三国演义飞将是谁 今热点
2、轻骑飞跃一三国人物。3、亲骑飞跃三国演义。4、三国演义飞将。以下内容关于《轻骑飞跃(打《三国演义》人名)》的解答。本
-
2023-02-25 14:13:01
阅读要从娃娃抓起!首届济南书市吸引萌娃们遨游书籍海洋,购书打折还补贴-焦点信息
齐鲁网·闪电新闻2月25日讯今天上午,第35届北京图书订货会分会场暨首届济南书市在济南舜耕国际会展中心启幕,这是北京图书
-
2023-02-25 13:06:37
中老年保健知识问答|每日讯息
1、《中老年保健知识问答》是福建科学技术出版社出版的图书。2、作者是蒙伟文。文章到此就分享结束,希望对大家有所帮助。
-
2023-02-25 11:09:56
全球热点!小规模纳税人企业所得税税率2022_小规模纳税人企业所得税税率
1、企业所得税税率一般为25%,但目前对年应纳税所得额低于3万元(含3万元)的小型微利企业,其所得减按50%计入应纳税所
-
2023-02-25 08:53:51
山东省农科教管理协会
1、山东省农科教管理协会是一个社会组织。本文到此分享完毕,希望对大家有所帮助。
-
2023-02-25 07:41:44
为副大总管苏将军谢罪表_每日信息
1、《为副大总管苏将军谢罪表》是唐代陈子昂创作的一篇散文。文章到此就分享结束,希望对大家有所帮助。
-
2023-02-25 04:55:44
先天性眼球震颤可以治疗好吗_眼球震颤可以治疗吗
1、1 什么是眼球震颤?眼球震颤是指眼睛不自觉的、有节奏的来回运动。2、眼球震颤的出现是由视觉、迷宫、中枢等与眼球位置控
-
2023-02-25 00:01:48
爱因斯坦生日成了霍金祭日_爱因斯坦生日
1、爱因斯坦是德裔美国物理学家(拥有瑞士国籍),思想家及哲学家,犹太人,现代物理学的开创者和奠基人,相对论——“质能关系
-
2023-02-24 22:15:12
融信集团 观察
1、融信集团(简称“融信”),于2003年创立,总部位于上海,是一家全国化发展的房地产企业。2、业务涵盖:地产开发、物业
-
2023-02-24 21:05:10
全球热文:淘宝叠猫猫队长怎么退队_天猫app叠猫猫队长换队伍方法教程
1、折叠猫队长可以退出吗?2、边肖在这里告诉大家队长是不能退队的~3、队长组队不能退出,队友随时可以退出。第二天解散队伍
-
2023-02-24 18:59:05
理学类是什么意思_理学类 天天快消息
1、理学是中国大学教育中重要的一支学科,是指研究自然物质运动基本规律的科学,大学理科毕业后通常即成为理学士。2、与文学、
-
2023-02-24 16:53:24
天天百事通!赵嘉敏_说一说赵嘉敏的简介
夏弥来为大家解答以下的问题,赵嘉敏,说一说赵嘉敏的简介,现在让我们一起来看看吧!1、赵嘉敏,昵称Savoki,1998年
-
2023-02-24 16:40:16
amd e350_环球速递
1、amde350是AMD公司APU中E系列的一款。2、是电脑的最主要的配件之一。文章到此就分享结束,希望对大家有所帮
-
2023-02-24 14:48:47
“第三支箭”发出!内房股全线跳涨,碧桂园 旭辉涨超13%
11月29日上午,港股内房股集体跳涨,新城发展涨近15%,旭辉、碧桂园涨超13%,富力地产涨超12%,龙光集团、融信中国
-
2023-02-24 12:54:57
外观更像途昂,两种动力选择,新款大众途岳3月1日开启预售 当前通讯
近日,从相关渠道获悉,上汽大众新款途岳(图片|配置|询价)将于3月1日开启预售,新车相比现款车型还是有很大变化的,外观方面更倾向于大众途昂
-
2023-02-24 10:51:28
扶风鹿糕馍
1、扶风鹿糕馍是一道陕西扶风地区的特色传统风味食品,为一种烤馍。馍面装饰有梅花鹿的图案,故名“鹿糕”。色泽白亮,味道
-
2023-02-24 08:47:28
富贵虾怎么区分公母?_世界观察
一般来讲,母的皮皮虾的个头没有公的那么大,而另一个区分公母的办法是通常,母的皮皮虾的脖子部位都会有一个白色的“王”字,公的皮皮虾在...
-
2023-02-24 06:06:46
每日热议!使用sigar获取本机 服务器、系统、CPU、JVM、内存信息
周六在家闲来无事学习了一下利用Sigar获取本机服务器、系统、CPU、JVM、内存等信息
-
2023-02-24 01:17:52
2月23日基金净值:易方达积极成长混合最新净值0.6865,跌0.15%
2月23日,易方达积极成长混合最新单位净值为0 6865元,累计净值为5 8786元,较前一交易日下跌0 15%。历史数据显示该基金近1个月下跌3 89%,近3
-
2023-02-23 22:01:52
【奋进的春天】强村富民描绘乡村振兴画卷
今年以来,九江市大力实施发展壮大村集体经济“三年倍增”行动,创新县级统筹、乡镇主导、村级联动发展模式,推动村集体经济发展步入快车道...
-
2023-02-23 18:46:02
戒烟最难熬的是那几天?
我从十几岁开始抽烟,至今烟龄三十多年了。平时没事一天一包,有应酬或其它人多的场合就要加量了,总的来说不算很多,所以也没打算戒掉它。今
-
2023-02-23 17:01:40
山东盛洋检测有限公司|今日热门
1、山东盛洋检测有限公司于2018年02月11日成立。2、法定代表人李册,公司经营范围包括:环境保护监测;土壤质量检
-
2023-02-23 14:56:51
李家超抵达广州展开访问!将推动人才流动科技金融多领域合作
2月23日,香港特区行政长官李家超率领特区政府代表团访问广州和深圳,展开上任后首次对粤港澳大湾区各城市的访问。南都记者注意到,李家超在个
-
2023-02-23 12:07:14
【世界时快讯】中无人机:公司经营状况良好
每经AI快讯,有投资者在投资者互动平台提问:据报道称,航天彩虹2023年在手订单接近翻倍,请问公司是否也一样,2023年订单明显增长?中无人机(
-
2023-02-23 10:29:18
环球热议:沪胶 空头优势增强
昨日,沪胶期货2305合约呈现放量增仓、略微收低的态势。盘中期价重心一度下探至12500元 吨一线下方运行,收盘略微收低0 56%,至12530元 吨。持
-
2023-02-23 09:12:08
台湾“四大三小天后”名副其实吗?大陆有哪些人能被称为“天后”? 当前关注
如下解答:娱乐圈一直是长江后浪推前浪,在乐坛四小天后强势出击的情况下,有一代人一直处于屹立不倒的位置,她们就是大陆四大天后:爱心大使毛
-
2023-02-23 08:39:43
红网数说丨A股回暖,湖南股民户均资产重回十万元|全球简讯
红网时刻新闻记者甘红张馨心图表徐丹张广蓉长沙报道春天来了,与天气一同转暖的还有A股。Wind数据显示,1月A股