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 官网进行查阅和学习。

推荐阅读

更多 >

最近更新

更多 >

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

2023-02-26 02:17:24

“撞衫”?“飞天”舱外航天服竟然藏着这么多黑科技

2023-02-25 21:00:33

中国邮政集团公司广州市分公司

2023-02-25 18:39:48

轻骑飞跃打三国演义中一个人名_轻骑飞跃打一三国演义人名_三国演义飞将是谁 今热点

2023-02-25 17:19:56

阅读要从娃娃抓起!首届济南书市吸引萌娃们遨游书籍海洋,购书打折还补贴-焦点信息

2023-02-25 14:13:01

中老年保健知识问答|每日讯息

2023-02-25 13:06:37

全球热点!小规模纳税人企业所得税税率2022_小规模纳税人企业所得税税率

2023-02-25 11:09:56

山东省农科教管理协会

2023-02-25 08:53:51

为副大总管苏将军谢罪表_每日信息

2023-02-25 07:41:44

先天性眼球震颤可以治疗好吗_眼球震颤可以治疗吗

2023-02-25 04:55:44

爱因斯坦生日成了霍金祭日_爱因斯坦生日

2023-02-25 00:01:48

融信集团 观察

2023-02-24 22:15:12

全球热文:淘宝叠猫猫队长怎么退队_天猫app叠猫猫队长换队伍方法教程

2023-02-24 21:05:10

理学类是什么意思_理学类 天天快消息

2023-02-24 18:59:05

天天百事通!赵嘉敏_说一说赵嘉敏的简介

2023-02-24 16:53:24

amd e350_环球速递

2023-02-24 16:40:16

“第三支箭”发出!内房股全线跳涨,碧桂园 旭辉涨超13%

2023-02-24 14:48:47

外观更像途昂,两种动力选择,新款大众途岳3月1日开启预售 当前通讯

2023-02-24 12:54:57

扶风鹿糕馍

2023-02-24 10:51:28

富贵虾怎么区分公母?_世界观察

2023-02-24 08:47:28

每日热议!使用sigar获取本机 服务器、系统、CPU、JVM、内存信息

2023-02-24 06:06:46

2月23日基金净值:易方达积极成长混合最新净值0.6865,跌0.15%

2023-02-24 01:17:52

【奋进的春天】强村富民描绘乡村振兴画卷

2023-02-23 22:01:52

戒烟最难熬的是那几天?

2023-02-23 18:46:02

山东盛洋检测有限公司|今日热门

2023-02-23 17:01:40

李家超抵达广州展开访问!将推动人才流动科技金融多领域合作

2023-02-23 14:56:51

【世界时快讯】中无人机:公司经营状况良好

2023-02-23 12:07:14

环球热议:沪胶 空头优势增强

2023-02-23 10:29:18

台湾“四大三小天后”名副其实吗?大陆有哪些人能被称为“天后”? 当前关注

2023-02-23 09:12:08

红网数说丨A股回暖,湖南股民户均资产重回十万元|全球简讯

2023-02-23 08:39:43

马洛塔:卢卡库有103公斤的体重 伤病让他在世界杯只能当配角

2023-02-23 05:01:01

【环球新要闻】新能源SUV别乱买!最新质量榜公布:比亚迪唐第六,Model Y入榜!

2023-02-22 23:46:57

38岁郭晶晶罕见看秀!经典黑白配出众又显嫩,同框黄景瑜不显龄 全球速递

2023-02-22 21:00:12

QQ音乐热歌榜前十,看完以后,我想问:华语乐坛还有未来吗?

2023-02-22 18:19:52

成都市人大代表熊欣:组建“AED急救”专业志愿者队伍

2023-02-22 16:09:38

德尔股份:公司已研发出加氢机样机,尚未量产-全球快播

2023-02-22 14:53:58

国家发展改革委等部门要求做好2023年春耕化肥保供稳价工作

2023-02-22 11:52:53

世界百事通!2月还没过完,2023年已诞生5部烂剧,每一部都烂得清新脱俗

2023-02-22 10:00:20

立返利科技有限公司是真的吗_立返利|世界今热点

2023-02-22 08:09:23

工艺规程编制规范国家标准_工艺规程-全球头条

2023-02-22 04:47:19

IPO定价9.32元,猪饲料生产商,播恩集团申购解读

2023-02-22 00:11:44

office2013激活工具激活不了咋办 office 2010不能使用怎么办如何激活成功_2月24日最新整理发布

2023-02-21 20:55:12

北京大学肿瘤医院保定医院项目开建,将减少40%跨区流动患者|当前热文

2023-02-21 18:45:55

天天观点:蔡徐坤新EP《现象》24日上线 一展KUN式音乐多样魅力

2023-02-21 16:50:42

教育部公布!三校合并,成立师范大学! 焦点速讯

2023-02-21 15:04:09

86版《西游记》副导演任凤坡逝世 享年83岁

2023-02-21 13:17:40

世界头条:车费31元变3万元!的哥主动退还“打车费”

2023-02-21 11:17:39

朗玛信息2月21日快速上涨

2023-02-21 09:46:08

本菲卡3-1博阿维斯塔迎联赛5连胜,贡萨洛-拉莫斯推射建功

2023-02-21 07:02:35

玉如意_说一说玉如意的简介

2023-02-21 02:55:50

气体常数rg与什么有关_气体常数

2023-02-20 22:45:11

全球观焦点:写意中国探寻汉字起源丨赏岳飞存世唯一手书遗物 感受中国文字之美

2023-02-20 19:54:56

96.72%的ETF基金今日上涨|焦点速看

2023-02-20 17:26:18

黎镑持续下跌 民众打砸银行泄愤-看热讯

2023-02-20 15:39:42

世界消息!粤海中粤 中山马口铁工业有限公司_关于粤海中粤 中山马口铁工业有限公司介绍

2023-02-20 13:45:01

打卡是什么意思_怎么理解打卡|当前热文

2023-02-20 10:54:41

演糖宝的演员是谁_糖宝是谁演的

2023-02-20 09:44:11

国学经典名句_国学经典名句及解释

2023-02-20 07:49:41

每日快讯!道士出山4深夜书店西瓜影视_道士出山4深夜书店

2023-02-20 03:35:27

如何设计儿童礼服_如何设计儿童礼服图片

2023-02-19 23:03:01

杨幂这是染发还是漂发呀?看这张随拍-当前热议

2023-02-19 19:03:48

谷氨酰基转移酶偏高有什么影响_谷氨酰基转移酶偏高有什么危害

2023-02-19 15:45:37

刘国梁观战!马龙陈梦3-1逆转对手,梦龙组合首秀迎开门红

2023-02-19 12:53:03

怎么在快手主页设置联系电话_快手主页怎么设置联系电话

2023-02-19 10:11:14

国际能源署署长称欧洲明年冬天将更加艰难

2023-02-19 07:41:08

万分之三怎么用%表示_同或怎么表示

2023-02-19 03:00:33

状态不佳!津琴科半场数据:地面对抗、盘带无一成功,评分仅6.3|天天看点

2023-02-18 21:54:49

从业会计资格证需不需要继续教育_2019年会计从业资格证还需要继续教育

2023-02-18 19:08:15

我被男同桌摸了奶|男朋友在公园就想做..._我被男同桌摸了奶

2023-02-18 16:18:53

明白玉鹤鹿同春笔架_对于明白玉鹤鹿同春笔架简单介绍

2023-02-18 13:59:19

全球新资讯:高中物理教学工作总结个人-高中物理教学工作总结

2023-02-18 10:44:48

拼项目拼发展!钢城高质量发展势头正劲 观焦点

2023-02-18 08:15:52

汽车挡风玻璃裂纹怎么修复_怎么修补汽车的挡风玻璃呢

2023-02-18 04:52:46

环球微头条丨若夫霪雨霏霏连月不开阴风怒号浊浪排空翻译_若夫霪雨霏霏连月不开什么意思

2023-02-18 00:49:24

【环球聚看点】中隔板和横隔板_横隔板

2023-02-17 21:10:58

河南:稳住“双千万”就业,托起农民增收基本盘

2023-02-17 19:05:01

珠海香洲长途车站儿童免票要什么条件?

2023-02-17 17:12:16

天天最新:北京门头沟区新增1名新冠感染者,活动轨迹及风险点位公布

2023-02-17 15:56:48

三极管的工作原理图_三极管的工作原理

2023-02-17 14:04:12

天天讯息:漯河加快改造第一水厂 推行精细化管理 提升供水能力

2023-02-17 11:36:23

玖月奇迹王小玮暴瘦颧骨突出,发缝超宽露头皮,戴两手镯近10万|视点

2023-02-17 10:03:12

全球热讯:半场-佩德里伤退韦霍斯特错失单刀 巴萨0-0曼联

2023-02-17 03:13:41

庆城合水两地公安协作 成功找到4名离家出走男童

2023-02-16 23:06:40

美媒详解今夏25大自由球员:欧文居首哈登次席 威少仅列第15|世界速看料

2023-02-16 20:09:06

播报:genesis是什么牌的车标志_cenesis是什么牌的车

2023-02-16 18:05:17

看热讯:张颂文“跌落神坛”,我拍手叫好

2023-02-16 15:58:07

2月16日午后快讯 环球视讯

2023-02-16 14:09:42

今天最新消息 国家发改委:下半年经济有望继续保持回升势头 全球关注

2023-02-16 11:57:03

天天观点:什么是威信

2023-02-16 11:02:24

两本写有百余名旅客的交接簿-全球焦点

2023-02-16 10:05:05

Win7浏览器提示“确实允许此网页访问剪贴板吗”怎么办?-系统之家

2023-02-16 08:50:02

教育部联合印发健康指南,中小学校内不得设置小卖部超市,为何? 今日快讯

2023-02-16 08:14:29

天天热资讯!十三星座查询表

2023-02-16 05:37:09

全球热门:划拨地房屋拆了也会有补偿吗

2023-02-16 03:41:39

通讯!山东省公务员考试时间_2022年山东省公务员考试报名时间

2023-02-16 02:59:01

苹果获得折叠屏技术专利:明年或率先试水iPad-关注

2023-02-15 23:55:29

热门:死痣

2023-02-15 23:44:16

天天即时:宜春去年GDP出炉:丰城661亿排区县第一,宜丰增速领跑

2023-02-15 21:05:34

单支玫瑰花包装方法教程 单只玫瑰花怎么包装

2023-02-15 20:17:29

2022年广西各市GDP和人均GDP,大市萎靡,小市崛起 热头条

2023-02-15 19:04:17

二级债基是什么意思_环球焦点

2023-02-15 17:38:35

CNH和CNY什么意思

2023-02-15 17:14:37

焦点速读:组织生活会批评与自我批评发言稿_个人自我批评发言稿

2023-02-15 16:02:24

26个省会城市常住人口:8城超千万 具体名单公布

2023-02-15 13:10:52

无锡振华2月15日快速上涨 世界新消息

2023-02-15 12:59:10

热门看点:拜仁巨星圆梦:等待3年,终获梅西球衣!家里挂着梅西照片

2023-02-15 11:00:29

如何用吸管和牙签做塔

2023-02-15 09:57:25

全球快讯:211和985大学有什么区别哪个好

2023-02-15 09:20:29

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

2023-02-15 07:54:57

《朋友我想对你说》八年级作文 天天快资讯

2023-02-15 05:17:47

世界百事通!CF手游最新最全最详细刷经验教程攻略

2023-02-15 04:08:10

山西公务员考试常识判断例题精讲-天天微资讯

2023-02-15 01:31:12

豪华轿车别乱选!仅13款质量达标,奥迪A4L第5,宝马5系、C级上榜_热资讯

2023-02-14 23:46:02

去除痘印痘疤的方法有哪些

2023-02-14 21:23:05

全球观天下!2023重庆南山植物园2月赏花攻略(樱花、郁金香)

2023-02-14 21:04:23

最新:众合科技:目前正开展数字人应用研究,基于web3.0的其他应用也在研究中

2023-02-14 19:06:02

六年级《用心灵去倾听》教学设计与反思

2023-02-14 17:50:51

最新快讯!女子情人节与前夫复婚:还是对方好是什么情况

2023-02-14 16:48:28

结婚送礼金有什么讲究 时讯

2023-02-14 15:12:57

聚焦:华光环能:公司一直严格按照监管要求履行信息披露义务,不存在应披露而未披露的重大信息

2023-02-14 13:38:58

资讯推荐:咀嚼生活的真味作文

2023-02-14 13:30:12

第一次见弟媳妇送什么礼物_世界快讯

2023-02-14 11:28:01

安宁金方日式森林温泉

2023-02-14 09:45:06

卸任两只基金,网传明星基金经理冯明远将离职?信达澳亚否认

2023-02-14 07:54:14

特工黛西·约翰逊是MCU最不受欢迎的女英雄之一

2023-02-14 06:25:42

今日快讯:基金账户一站式打通 股票资产能否接力“贯通”

2023-02-14 04:00:49

当前视点!喝咖啡睡不着补救措施

2023-02-14 02:27:34

Mysteel日报:华东地区热轧板卷价格震荡走弱 成交表现偏弱|天天最资讯

2023-02-13 23:44:55

省政协委员是什么级别

2023-02-13 23:44:43

当日快讯:中方:菲海警船2月6日擅自闯入仁爱礁海域,中国现场操作专业、克制

2023-02-13 21:02:48

kva和kw怎么换算

2023-02-13 19:52:02

环球速递!铜排规格型号大全_铜排规格型号表

2023-02-13 18:58:29

每日快看:企业薪酬管理系统化_企业薪酬管理系统

2023-02-13 17:05:09

百度网盘下载的视频在哪个文件夹_百度网盘下载的视频在哪_全球热头条

2023-02-13 15:06:13

天天百事通!哈兰德:多么完美的团队表现,感谢球迷成为球队的第12人

2023-02-13 13:10:19

2023广东小高考全科试题及答案汇总_更新中_环球最新

2023-02-13 11:15:04

亿田智能:截止2023年2月10日股东总户数为7769户

2023-02-13 09:48:56

苟安_关于苟安的简介_全球即时

2023-02-13 09:01:39

合水县气象台继续发布道路结冰黄色预警信号

2023-02-12 12:11:36

环球即时:多警种联合行动!“启航2023”济南市酒醉驾违法整治统一行动正式启动

2023-02-12 09:37:29

快资讯:山东女足队员家遭强拆?官方:马上核实

2023-02-12 06:08:20

天天速读:送男生的礼物排行榜

2023-02-12 01:21:55

嫂子生日送什么鲜花

2023-02-11 21:35:30

天天动态:湖北引进逾千亿元文旅重点项目 “文旅+”产业融合发展趋势明显

2023-02-11 18:18:39

供应仰韶70度礼品酒头_当前快看

2023-02-11 15:15:02

全球微头条丨甘肃省生态环境厅发布2023年1月份全省14个地级城市环境空气质量排名情况

2023-02-11 11:49:56

《GRIDMAN UNIVERSE》正式预告公开 3月24日上映

2023-02-11 09:07:30

意甲-吉鲁破门特奥助攻克亚尔失误造险情 米兰1-0都灵取近8场首胜

2023-02-11 06:14:43

环球焦点!“鸡肋”怀斯曼换“手铐”小佩顿——勇管再次化腐朽为神奇

2023-02-11 02:04:35

全球报道:淘宝云客服在哪打开?云客服的职责是什么?

2023-02-11 00:16:30

丙二醇是什么结构简式_丙二醇是什么-环球即时看

2023-02-10 22:52:20

新闻稿发布的作用优势

2023-02-10 20:56:42

世界信息:2022普斯卡什奖候选:理查利森侧钩、波兰残疾人倒钩、帕耶世界波

2023-02-10 19:59:42

【天天报资讯】杜兰特又一新决定!再见了,7号死神!让NBA整整等待4年......

2023-02-10 18:12:26

全球热点!希慎兴业(00014.HK)2月10日收盘跌1.28%,主力资金净流出288.96万港元

2023-02-10 16:41:01

全球观点:31省份新增本土“3504+22512”

2023-02-10 16:42:25

甄选足篮专家推荐:应天揽足彩203万 易乾坤中186万

2023-02-10 14:56:14

环球百事通!“疯狂星期四”交易汇总评级:湖人三大利好,杜兰特保证太阳下限

2023-02-10 13:13:13

全球焦点!春天的花开秋天的风是什么歌

2023-02-10 11:43:55

小源说金:2.10金价如期破位下跌!日内黄金走势看延续下行!

2023-02-10 11:11:54

天天讯息:民间故事:诸葛亮在庭院种植桑树的真实原因很无奈

2023-02-10 09:41:42

焦点速看:云从科技(688327)2月9日主力资金净卖出5185.97万元

2023-02-10 07:55:23

小学生可以做什么小发明_当前快讯

2023-02-10 07:59:38

百度空间相册登录_百度空间相册 每日消息

2023-02-10 03:52:12

疑陈学冬女友曝光,网友调侃“放开我老公”_聚焦

2023-02-09 23:52:51

三年级上册数学乘法竖式计算题

2023-02-09 21:58:39

在一起叫梦 分开了叫痛 爱症晚期的伤感个性网名

2023-02-09 20:17:58

热文:油门错当刹车!杭州宝妈带俩娃开车冲进河里,关键时刻她想起一句话……

2023-02-09 19:21:05

国防部:不接受美方中美防长通话提议详细内容-天天信息

2023-02-09 17:53:34

黑铁套装图纸_黑铁套装材料_全球今热点

2023-02-09 16:04:57

电商平台疑似下架ChatGPT账号贩卖-环球今头条

2023-02-09 15:47:50

天天热点!阿布扎比国家石油公司将收购奥地利石油天然气集团24.9%股权

2023-02-09 14:02:31

焦点速看:三星笔记本蓝牙怎么打开

2023-02-09 12:03:17

左江科技2月9日快速上涨

2023-02-09 11:19:12

桂阳:舂陵碧水荡清波

2023-02-09 09:59:29

工信部发布制造业可靠性提升优秀案例 湖南案例数量居全国第一

2023-02-09 08:56:14

全球观速讯丨win7怎么进入bios win7进入bios的方法

2023-02-09 08:05:53

bios添加slic_SLIC是什么win7BIOS中SLIC怎么使用设置 环球聚看点

2023-02-09 07:04:26

世界热推荐:海洋中最长的硬骨鱼

2023-02-09 04:39:12

环球热点评!怎么知道win7是否正版_如何验证win7系统是否是正版

2023-02-09 04:05:58

全球今日报丨BPPV

2023-02-09 01:32:23

【天天播资讯】君子兰养护方法有哪些?

2023-02-09 00:30:54

CWE 环球今热点

2023-02-08 23:01:19

黄帝内经五脏六腑养生法

2023-02-08 20:25:02

赋能地下盐穴  助力高效用能(经济聚焦·一线看储能②)

2023-02-08 19:56:08

一吕二赵三典韦 四关五马六张飞什么意思 前沿资讯

2023-02-08 18:55:02

詹姆斯:我今天戴了发带 那代表我NBA旅程开始的地方

2023-02-08 17:03:19

老南京素什锦菜的家常做法

2023-02-08 16:42:55

韩娱快闪是什么_快闪是什么

2023-02-08 16:06:14

桌球规则黑八_桌球规则

2023-02-08 14:08:01

立体贺卡手工制作方法|世界热资讯

2023-02-08 12:37:55

华泰证券(06886):“22华泰G1”将于2月14日开始付息-环球精选

2023-02-08 12:38:37

万兴科技2月8日快速反弹_今头条

2023-02-08 10:10:01

短期宏观乐观情绪降温 锌市供强需弱现实持续

2023-02-08 09:11:21

几种韩语考试介绍

2023-02-08 08:36:26

教师注册收不到验证码_教师注册 今日热文

2023-02-08 07:53:00

开工第一天怎么发朋友圈装修_开工第一天怎么发朋友圈

2023-02-08 04:59:43

嘉宝米粉2021下架事件最新消息 雀巢称现在安全

2023-02-08 04:34:18

时讯:planform

2023-02-08 02:07:41

黄帝陵公祭活动每年什么时候举行

2023-02-08 00:31:15