【ES三周年】万字长文带你实战 Elasticsearch 搜索

来源:腾讯云 2023-02-28 20:59:56

ES 高级实战

前言

上篇我们讲到了 Elasticsearch 全文检索的原理《别只会搜日志了,求你懂点原理吧》,通过在本地搭建一套 ES 服务,以多个案例来分析了 ES 的原理以及基础使用。这次我们来讲下 Spring Boot 中如何整合 ES,以及如何在 Spring Cloud 微服务项目中使用 ES 来实现全文检索,来达到搜索题库的功能。

而且题库的数据量是非常大的,题目的答案也是非常长的,通过 ES 正好可以解决 mysql 模糊搜索的低效性。


(资料图片)

通过本实战您可以学到如下知识点:

Spring Boot 如何整合 ES。微服务中 ES 的 API 使用。项目中如何使用 ES 来达到全文检索。

本篇主要内容如下:

主要内容

本文案例都是基于 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 API 已经废弃了

所以我们只能用 Java REST Client 了。而它又分成两种:高级和低级的。高级包含更多的功能,如果把高级比作MyBatis的话,那么低级就相当于JDBC。所以我们用高级的 Client。

高级和低级 Client

二、整合检索服务

我们把检索服务单独作为一个服务。就称作 passjava-search 模块吧。

1.1 添加搜索服务模块

创建 passjava-search 模块。

首先我们在 PassJava-Platform 模块创建一个 搜索服务模块 passjava-search。然后勾选 spring web 服务。如下图所示。

第一步:选择 Spring Initializr,然后点击 Next。

选择 Spring Initializr

第二步:填写模块信息,然后点击 Next。

passjava-search 服务模块

第三步:选择 Web->Spring Web 依赖,然后点击 Next。

mark

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
Rest Client 官方文档
加上 Maven 依赖。

对应文件路径:\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 版本了,如下图所示:

设置版本为 7.4.2
引入 PassJava 的 Common 模块依赖。

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 自动装载成功。

ES 测试结果

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

结果如下所示:

查询 users 索引结果

可以从图中看到有一条记录被查询出来,查询出来的数据的 _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 字符串,结果如下所示:

格式化 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

得到的结果确实是我们封装的 BankMember 对象,而且里面的属性值也都拿到了。

1.7.3 获取年龄分布聚合信息

ES 返回的 response 中,年龄分布的数据是按照 ES 的格式返回的,如果想按照我们自己的格式来返回,就需要将 response 进行处理。

如下图所示,这个是查询到的年龄分布结果,我们需要将其中某些字段取出来,比如 buckets,它代表了分布在 21 岁的有 4 个。

ES 返回的年龄分布信息

下面是代码实现:

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 值。

ES 返回的平均薪资信息

代码实现:

Avg balanceAvg1 = aggregations.get("balanceAvg");System.out.println("平均薪资:" + balanceAvg1.getValue());

打印结果如下,平均薪资 28578 元。

打印结果:平均薪资

三、实战:同步 ES 数据

3.1 定义检索模型

PassJava 这个项目可以用来配置题库,如果我们想通过关键字来搜索题库,该怎么做呢?

类似于百度搜索,输入几个关键字就可以搜到关联的结果,我们这个功能也是类似,通过 Elasticsearch 做检索引擎,后台管理界面和小程序作为搜索入口,只需要在小程序上输入关键字,就可以检索相关的题目和答案。

首先我们需要把题目和答案保存到 ES 中,在存之前,第一步是定义索引的模型,如下所示,模型中有 titleanswer字段,表示题目和答案。

"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 索引

我们可以通过以下命令来查看 question 索引是否在 ES 中:

GET _cat/indices

执行结果如下图所示:

查看 ES 中所有的索引

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 。

mark

第一步,保存数据到 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 字段上。如下图所示:

用 model 来组装数据

3.6 保存数据到 ES

我在 passjava-search 微服务中写了一个保存题目的 api 用来保存数据到 ES 中。

保存数据到 ES

然后在 passjava-question 微服务中调用 search 微服务的保存 ES 的方法就可以了。

// 调用 passjava-search 服务,将数据发送到 ES 中保存。searchFeignService.saveQuestion(esModel);

3.7 检验 ES 中是否创建成功

我们可以通过 kibana 的控制台来查看 question 索引中的文档。通过以下命令来查看:

GET question/_search

执行结果如下图所示,有一条记录:

mark

另外大家有没有疑问:可以重复更新题目吗?

答案是可以的,保存到 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 时,需要构建查询参数。

组装查询参数的核心代码如下所示:

组装查询参数
第一步:创建检索请求。第二步:设置哪些字段需要模糊匹配。这里有三个字段:title,answer,typeName。第三步:设置如何分页。这里分页大小是 5 个。第四步:调用查询 api。

4.4 格式化 ES 返回结果

ES 返回的数据是 ES 定义的格式,真正的数据被嵌套在 ES 的 response 中,所以需要格式化返回的数据。

核心代码如下图所示:

格式化 ES 返回结果
第一步:获取查到的数据。第二步:获取真正命中的结果。第三步:格式化返回的数据。第四步:组装分页参数。

4.5 测试 ES 查询

4.5.1 实验一:测试 title 匹配

我们现在想要验证 title 字段是否能匹配到,传的请求参数 keyword = 111,匹配到了 title = 111 的数据,且只有一条。页码 pageNum 我传的 1,表示返回第一页数据。如下图所示:

测试匹配 title

4.5.2 实验二:测试 answer 匹配

我们现在想要验证 answer 字段是否能匹配到,传的请求参数 keyword = 测试答案,匹配到了 title = 测试答案的数据,且只有一条,说明查询成功。如下图所示:

测试匹配 answer

4.5.2 实验三:测试 id 匹配

我们现在想要匹配题目 id 的话,需要传请求参数 id,而且 id 是精确匹配。另外 id 和 keyword 是取并集,所以不能传 keyword 字段。

请求参数 id = 5,返回结果也是 id =5 的数据,说明查询成功。如下图所示:

测试 id 匹配

五、总结

本文通过我的开源项目 passjava 来讲解 ES 的整合,ES 的 API 使用以及测试。非常详细地讲解了每一步该如何做,相信通过阅读本篇后,再加上自己的实践,一定能掌握前后端该如何使用 ES 来达到高效搜索的目的。

当然,ES API 还有很多功能未在本文实践,有兴趣的同学可以到 ES 官网进行查阅和学习。

上一篇 :

下一篇 :

x 广告
高层声音

【ES三周年】万字长文带你实战 Elasticsearch 搜索

2023-02-28

矽尘作业名词解释_矽-天天观点

2023-02-28

世界热门:消息称​字节跳动在英美上线生活方式社区Lemon8

2023-02-28

什么是通货膨胀?它是怎样产生的?|每日聚焦

2023-02-28

中水物资咨询公司再获国家高新技术企业认定_天天观点

2023-02-28

最好听的群名字女生_最好听的群名字 焦点日报

2023-02-28

先上一批“网红局长”,再来一波消费券,地方旅游争相放大招

2023-02-28

抚州新型冠状病毒肺炎疫情:2月28日抚州疫情最新消息今天数据统计情况通报

2023-02-28

黄海造船为山东海事局建造60米级B型巡逻船下水-环球资讯

2023-02-28

Truffles

2023-02-28

哈里王子变卖资产还债是怎么回事_哈里王子变卖资产还债是为什么 当前热讯

2023-02-28

【天天报资讯】市农业农村局“四个一”落实“市56条”

2023-02-28

全球今日讯!成姓怎么读_成姓

2023-02-27

环球微动态丨选豪华中型车,不妨看看这款被誉为有颜有料的宝马3系!29.99万起

2023-02-27

四川富顺召开2023年春耕生产现场会-天天报资讯

2023-02-27

忧心忡忡的穷人甚至对出自_忧心忡忡的穷人出自马克思那本书

2023-02-27

佛山机动车免检范围

2023-02-27

【收评】纸浆日内下跌0.49% 机构称纸浆交投不旺 实时焦点

2023-02-27

稳定输出!穆雷半场10中5贡献13分

2023-02-27

买房哪个网站比较好_买房哪个网站最靠谱_天天观焦点

2023-02-27

2022年度全国十大考古新发现初评结果公布_新动态

2023-02-27

新华全媒+ | 西藏:高原快递直达边境百姓家-天天热推荐

2023-02-27

凤歌小说最新_凤歌GL 全球快资讯

2023-02-27

上海郊外 环球最新

2023-02-27

今日看点:上机数控拟定增募资不超58.19亿元 进一步提升硅料产能

2023-02-27

硝基苯的制备步骤_硝基苯的制备

2023-02-26

丕阐|当前关注

2023-02-26

内勤岗位职责_内勤的岗位职责是什么

2023-02-26

东渡河-当前资讯

2023-02-26

“春光”(53)|上游主题摄影征稿作品展——贾维泽作品

2023-02-26

世界球精选!冷酸灵母公司冲击IPO!一年卖出3亿支,温氏投资加持

2023-02-26

中医古籍珍本集成:医案医话医论卷--续医说

2023-02-26

为上海安全度汛增添重要保障!航塘港南延伸工程通过完工验收

2023-02-26

环球简讯:河北外国语学院怎么样好不好_河北外国语学院怎么样

2023-02-26

中国和尼泊尔的故事 每日速看

2023-02-26

天天热点!跑步怎么跑得快视频_跑步怎么跑得快

2023-02-26

肝癌早期身体有什么症状_肝癌早期身体有什么表现-全球快讯

2023-02-25

焦点滚动:中国藏文报刊发展史

2023-02-25

正月十五是法定节假日吗_正月十五会放假吗 全球观速讯

2023-02-25

环球速递!屏南天宝寺

2023-02-25

卫星瞰京津冀协同发展:两个“村”,垦出机制创新“试验田” 天天快讯

2023-02-25

赌场赌博场所详细介绍|今日快讯

2023-02-25

天天新消息丨临潼区新丰街道长条村志愿服务队

2023-02-25

世界聚焦:梦幻西游萌大奶打造全服第一5特殊画魂,大佬一晚上连出4件无级别

2023-02-25

栀子花开票房是赚是亏_栀子花开 票房

2023-02-25

乐布

2023-02-25

好心女孩路遇流浪大叔,为其买面条还将其送医

2023-02-24

02月24日从杭州出发到河源的防疫政策

2023-02-24

鲁比

2023-02-24

盗墓笔记导演李仁港_盗墓笔记导演 天天快看点

2023-02-24

西安灵活就业人员医保2023年缴费基数是多少

2023-02-24

河北省舞蹈类专业统考合格线划定

2023-02-24

阿里新型冠状病毒肺炎疫情:2月24日阿里疫情最新消息今天数据统计情况通报_环球观点

2023-02-24

长三角多地公布新生儿爆款名:“沐”“玥”受欢迎

2023-02-24

焦点热文:欧联杯天使迪玛利亚帽子戏法!意甲尤文图斯3-0 球王梅西开心笑了

2023-02-24

“吃饭很方便,价格也能接受”

2023-02-24

环球动态:阿联酋这个富二代挺努力的,要造无人版歼20,还要送宇航员上太空

2023-02-24

后来日文版歌词音译_后来日语版音译歌词_最新

2023-02-23

世界今热点:苹果手机怎么设置流量提醒

2023-02-23

信息:量子信息技术3大方向:中国有2项全球第一,1项全球第二

2023-02-23

中果网

2023-02-23

全球快看:西班牙国防大臣:将向乌克兰提供6辆“豹2”坦克

2023-02-23

大晚上玩什么游戏啊,适合男生晚上玩的游戏推荐|今日聚焦

2023-02-23

世界速递!销售现金比率怎么看_销售现金比率

2023-02-23

振东制药:融资净买入493.85万元,融资余额3.22亿元(02-22)

2023-02-23

广惠寺北山五族

2023-02-23

郑州民警李天晓等18位民警获得2022河南“最美基层民警”荣誉称号_焦点热文

2023-02-22

世界热点!今日快讯新闻_今日快讯怎么关闭

2023-02-22

西蒙斯曾与比尔赌5000美金自己两罚全进 随即罚丢一球-环球关注

2023-02-22

优哉游哉的意思_优哉游哉的意思

2023-02-22

【新要闻】优雅的意思和用途_优雅的意思

2023-02-22

《狂飙》何黎明的权力有多大?别看他是副书记,权力可不输一把手-全球短讯

2023-02-22

合众思壮2月22日快速反弹

2023-02-22

全球快资讯:见行动 看效果——2023区长访谈:津南区专场

2023-02-22

汇签与会签的区别和联系_汇签与会签的区别

2023-02-22

要闻速递:机构评美国1月成屋销售数据

2023-02-22

简述windows的文件命名规则_文件命名规则

2023-02-21

今日预售,才8万多,拥有20万的实力!有排面,新车终于来了 全球今头条

2023-02-21

中证金融市场化转融资业务试点上线

2023-02-21

今日播报!酒驾被查驾车冲卡,犯罪嫌疑人妨害公务被批准逮捕

2023-02-21

哈尔滨一在建地铁工地突发塌陷 官方:已回填,无人员伤亡

2023-02-21

二月二“龙抬头” 不得不尝“煎龙麟” 世界播报

2023-02-21

每日速讯:塔牌集团:2月20日获融资买入431.50万元,占当日流入资金比例10.56%

2023-02-21

怎样把360浏览器改为极速模式_如何把360浏览器改为极速模式

2023-02-21

杜兰特确定复出日期 太阳没人搞破坏比篮网专注 带保罗夺冠没问题

2023-02-21

人口大省:常住人口连续两年减少,人口自然增长率62年来首现负增长!云南、长沙、沈阳等地出台生育支持政策 全球聚看点

2023-02-20

真的好想你原唱_我好想你歌词 今日热闻

2023-02-20

新时达董秘回复:公司经营情况敬请关注公司在指定披露媒体巨潮资讯网披露的定期报告_看点

2023-02-20

今日热搜:百万粉丝经营法则

2023-02-20

岳阳如何查询社保缴费记录和缴费明细呢,一文带你了解|天天播报

2023-02-20

高仪、美标、唯宝、班尼戈、松下、杜拉维特、马斯科、箭牌、九牧、惠达、玫瑰岛、中宇、心海伽蓝等最新动态 天天观速讯

2023-02-20

天天观点:“丝路海运”电商快线吞吐量突破2万标箱

2023-02-20

今热点:英媒:消息人士透露,巴西总统卢拉计划于3月28日访华

2023-02-20

【速看料】桑乔社媒:很高兴取得进球,但重点转移到未来重要的一周

2023-02-20

颈椎三伏贴有什么作用吗_颈椎三伏贴有什么作用_当前热门

2023-02-19

如何去除防水嵌缝-当前快看

2023-02-19

如何在不平整的洞口安装门框

2023-02-19

钩组词_汉字钩组词

2023-02-19

全省民政工作暨民政系统党风廉政建设工作会议在长沙召开|当前信息

2023-02-19

世界今头条!乡村要振兴,医药要先行

2023-02-19

1天到访500组!日均成交220套!西安楼市“火起来”了?

2023-02-18

快讯:怡合达(301029):2023年2月14日、2月16日、2月17日投资者关系活动记录表

2023-02-18

《崩坏星穹铁道》激奏雷电的乐队介绍

2023-02-18

朝鲜泡菜萝卜的制作方法_朝鲜泡菜|天天观点

2023-02-18

陈宇浩当选龙门县县长

2023-02-18

北京大学第一医院密云医院召开内科学科建设评估工作推进会|环球快看点

2023-02-18

祖国发展我成长手抄报内容简短_祖国发展我成长手抄报内容

2023-02-18

FIBA更新世预赛亚大区实力榜:中国男篮上升3位高居第一 天天日报

2023-02-18

天天速递!美股大型科技股盘前多数下跌,Meta跌超1%

2023-02-17

人体bmi正常值怎么算_人体bmi正常值是多少|全球快看

2023-02-17

谁是各位置最佳防守人?美媒评15人名单!卡鲁索入选 巴特勒排第3-天天讯息

2023-02-17

云南“茶城森警”短视频科普野生动物保护|全球要闻

2023-02-17

2月14日人民币兑美元中间价上调15个基点

2023-02-17

捷邦科技:公司适用于固态电池的产品主要为碳纳米管产品_焦点报道

2023-02-17

办公用品文件夹的种类_文件夹办公用品 焦点播报

2023-02-17

2021qq底部小世界怎么关闭_2021qq底部小世界怎么关闭vivo手机

2023-02-17

各地加大举债稳增长 推动化解隐性债务防风险

2023-02-17

购买的第一辆车超过40%主定制车来了!快来选择你的定制明星吧! 当前报道

2023-02-16

群众新闻:陕西建立路演项目服务机制加快科技成果落地 全球要闻

2023-02-16

中途岛位置地图图片_中途岛位置地图

2023-02-16

环球热点!广州地铁站外安检 具体什么情况试点有哪些

2023-02-16

世界最资讯丨中国联通一周人事调整:多位副总变更,都称得上 “通信大将”

2023-02-16

安州般若水阁纳凉喜遇薛员外乂 快消息

2023-02-16

纸性恋是什么意思

2023-02-16

393个“微网格”精准反诈骗

2023-02-16

天天动态:全国技工证查询网站_技工证书查询网站

2023-02-16

【机构调研记录】鹏华基金调研皓元医药 天天日报

2023-02-16

金口诀|天天热头条

2023-02-16

播报:饶芯语 演员_演员饶芯语生活照

2023-02-16

环球热讯:今日热点更新 男子疑碰瓷公交被路人淡定拖走 这是什么场面?【图】

2023-02-16

定期到期后不取怎么算-全球热消息

2023-02-15

聚焦:周易六十四卦详解 周易全文及译文及解说完整版

2023-02-15

环球讯息:这款明朝妙娘子真好看!

2023-02-15

q币可以充话费吗 这样操作就可以

2023-02-15

央行超量续作,短期内降息空间多大?

2023-02-15

冯绍峰赵丽颖结婚了吗|当前要闻

2023-02-15

信用卡暂停使用是什么意思 全球新消息

2023-02-15

全球观速讯丨湖南省儿童医院推出ICU家属开放日

2023-02-15

如何编织手提包

2023-02-15

全球资讯:台湾拒绝购买立陶宛农产品 这到底是怎么回事?

2023-02-15

在卡片上闪闪发光的方法

2023-02-15

国家希望工程1040_国家怎样保护1040工程简介介绍

2023-02-15

全球通讯!武隆一日游导游词5篇

2023-02-15

天天观点:【机构调研记录】南方基金调研唯特偶、东方钽业等3只个股(附名单)

2023-02-15

全球观点:鲁迅名言有关时间

2023-02-15

黑荞麦茶的制作方法_黑荞麦茶如何制作呢|天天新消息

2023-02-15

汉高祖刘邦是个什么样的人

2023-02-15

西甲一周资讯 | 皇马赢得世俱杯冠军;巴萨豪取联赛6连胜-全球今日报

2023-02-15

高血压防治健康知识讲座_高血压防治健康讲座

2023-02-14

建筑实习总结5篇精选-世界微资讯

2023-02-14

TA:前利兹联主帅马什是南安普顿新帅首选,最终决定将很快做出|报道

2023-02-14

今日热闻!学生保证书

2023-02-14

德宏口岸经济迎来开门红-速读

2023-02-14

A股共有306只个股股价跌破每股净资产,荣盛发展 民生银行 *ST紫晶市净率最低_环球报资讯

2023-02-14

每日播报!i9-13900H+满血4060游戏本 华硕天选4系列开始预约

2023-02-14

食品厂品管员的岗位职责-速看料

2023-02-14

滴耳油的正确使用方法_如何使用滴耳油_世界即时

2023-02-14

全球速读:第82集团军某旅狠抓基层风气监督员队伍建设

2023-02-14

天天看点:给医护人员送什么礼物合适

2023-02-14

焦点快播:王智向复活团姐姐们道歉:表达可能出现了失误

2023-02-14

环球看热讯:上海大爷的这份“白酒单”受到网友点赞,虽然便宜,但都是佳酿

2023-02-14

红绳带在左脚和右脚有什么区别 当前聚焦

2023-02-14

2023年小规模增值税普通发票税率是多少_小规模纳税增值税税率1 天天速讯

2023-02-14

热点!什么叫PSP游戏

2023-02-13

#(经济)探访贵州最大快递物流园 天天精选

2023-02-13

环球微动态丨中国四大盐场

2023-02-13

检测到外星生命“存在证据”!“三体人”要来了吗? 今日关注

2023-02-13

泉州养老保险账户怎么查询,怎么查看自己的缴费记录?_热推荐

2023-02-13

全球球精选!萌娃游戏比拼脑力

2023-02-13

【环球热闻】机构观点:纯碱延续跌势

2023-02-13

海能技术盘中创历史新高

2023-02-13

【天天速看料】苹果、辉瑞CEO预计将在下月访华

2023-02-13

全球看热讯:雷军看好的ChatGPT,如何看小米汽车?|钛媒体焦点

2023-02-13

王健林金融梦未竟,三位掌舵人已落马 看热讯

2023-02-12

死神的试炼2无敌版_死神的试炼2

2023-02-12

世界快看:汽车疑问解答:宝来后备箱弹不起来是什么原因

2023-02-12

每日头条!成人礼送什么礼物最好

2023-02-12

桃花姬阿胶糕的功效及食用方法_桃花姬

2023-02-11

贵州省2023年度空军招飞复选检测即将启动

2023-02-11

最资讯丨返校火车票怎么买?今年有这些新变化!

2023-02-11

申办建设银行汽车信用卡需要哪些资料_天天百事通

2023-02-11

天天快讯:美为发展人工智能武器系统“开绿灯”

2023-02-11

教育学硕士_说一说教育学硕士的简介 每日热点

2023-02-11

天天观焦点:淘特靠谱吗?淘特卖的东西是正品吗?

2023-02-11

晚新闻丨定了!在学校设置这一岗位……;营运线路调整!石家庄最新通告

2023-02-10

02月10日从嘉兴出发到天水的防疫政策

2023-02-10

网络媒体广告文案的作用

2023-02-10

世界快消息!罗马拼音在线翻译器中文_罗马拼音在线翻译

2023-02-10

全球要闻:意甲AC米兰vs都灵

2023-02-10

全球微资讯!乌俄外长将讨论建立停火制度

2023-02-10

榆林、鄂尔多斯等十地法院建立执行联动协作机制

2023-02-10

产妇孕妈情人节礼物|天天信息

2023-02-10

天诛忍凯旋游戏攻略_天诛忍者_世界关注

2023-02-10

里昂:予永利澳门“买入”评级 目标价降至11.9港元

2023-02-10

巨化股份2月10日盘中涨幅达5%

2023-02-10

【天天热闻】第一次拜访客户带什么礼物好

2023-02-10

如何在手机屏幕上养一只宠物|每日精选

2023-02-10

杀好的鱼怎么保鲜 杀好的鱼怎么保存保鲜|每日速递

2023-02-10

简讯:孝武帝是哪个朝代_孝武帝

2023-02-10

英超新冠检测6人阳性 但英超联赛不提供具体信息 天天微资讯

2023-02-10

返回顶部