当前位置: 首页 > 聚焦 > 滚动 >

世界新动态:【ES三周年】万字长文带你实战 Elasticsearch 搜索

时间:2023-02-27 04:00:36

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

标签: Java ElasticsearchService

来源: 腾讯云 编辑: FN008
相关阅读
  • 2023-02-27 04:00:36世界新动态:【ES三周年】万字长文带你实战 Elasticsearch 搜索
  • 2023-02-26 23:03:17最新:养猫or养狗?台湾民众这样选
  • 2023-02-26 20:46:50世界文化名人李时珍
  • 2023-02-26 20:01:42天天快播:福娃动画片1_福娃 2007—2008年出品的动画片
  • 2023-02-26 17:01:13今日热闻!找回网
  • 2023-02-26 15:11:33【天天速看料】吹寄制理
  • 2023-02-26 13:51:02北京流感病例数超新冠,流感是否会与新冠叠加影响?
  • 2023-02-26 10:57:46丈夫被妻子误伤未责怪反安慰妻子 玩笑归玩笑不要动剪刀
  • 2023-02-26 09:59:30揉胸除灵师
  • 2023-02-26 07:45:58“要幸福哦!”日本民众挥泪告别熊猫香香 中国网友发出邀请
  • 2023-02-27 04:00:36世界新动态:【ES三周年】万字长文带你实战 Elasticsearch 搜索
  • 2023-02-26 23:09:33全球看热讯:名媛肢解案嫌犯背景曝光 涉案三名男子均有犯罪前科
  • 2023-02-26 23:04:28唤醒植物人丈夫的女孩返还所有善款 还助学7名儿童
  • 2023-02-26 23:03:17最新:养猫or养狗?台湾民众这样选
  • 2023-02-26 22:54:02焦点要闻:梅花探春、早樱怒放、油菜花盛开……春天的味道
  • 2023-02-26 22:49:15世界即时看!怎样提高英语综合能力 提高英语综合能力的方法
  • 2023-02-26 22:39:58每日动态!河南被称为什么之乡 河南有什么美誉之称
  • 2023-02-26 22:37:43世界热讯:广州被称为什么都 广州相关介绍
  • 2023-02-26 22:37:04全球热点!红豆要煮多久 煮红豆多长时间能熟
  • 2023-02-26 22:32:25世界热消息:炖羊肉放什么香料会有香味 放哪些香料炖羊肉比较好
  • 2023-02-26 22:17:00世界热点评!全国最“有钱”的十座城市:北京资金总量超20万亿,苏州排第9
  • 2023-02-26 22:05:15全球观天下!榆林高新区第十三小学开建
  • 2023-02-26 22:02:06【天天报资讯】以案为鉴!苏州望亭镇新埂村集中观看警示教育片
  • 2023-02-26 21:58:33缅怀!他是最晚被解密的两弹一星元勋
  • 2023-02-26 21:55:29全球新消息丨中医义诊进校园,苏州相城区中医医院为老师们的健康“把脉”
  • 2023-02-26 21:51:08怎样养杜鹃花 养殖杜鹃花的注意事项
  • 2023-02-26 21:46:25螃蟹能不能和梨子一起吃 螃蟹和梨子适合一起吃吗
  • 2023-02-26 21:46:16【聚看点】发财树的养殖方法和浇水 发财树怎样养殖和浇水呢
  • 2023-02-26 21:44:53当前焦点!怎样判断燕窝变质了 如何判断燕窝变质没有
  • 2023-02-26 21:42:47快看:qq网名男生简单阳光 简约阳光温暖的男孩昵称集锦
  • 2023-02-26 20:56:29【天天时快讯】一移民船在意大利海岸附近沉没 造成至少40人丧生
  • 2023-02-26 20:51:38【全球新要闻】通心粉需要煮多久 通心粉煮多长时间才熟呢
  • 2023-02-26 20:50:00焦点观察:花300多万买精装房 收房时却发现被水泡了
  • 2023-02-26 20:46:50世界文化名人李时珍
  • 2023-02-26 20:44:52当前滚动:喝速溶咖啡可以减肥吗 喝速溶咖啡有减肥效果吗
  • 2023-02-26 20:40:50环球今日讯!减肥能不能吃寿司 减肥期间吃寿司好吗
  • 2023-02-26 20:35:30焦点快看:长寿花什么时候浇水 长寿花的浇水时间及方法
  • 2023-02-26 20:31:19桑葚干如何保存 桑葚干怎样保存比较好
  • 2023-02-26 20:01:42天天快播:福娃动画片1_福娃 2007—2008年出品的动画片
  • 2023-02-26 19:51:10世界微速讯:怎样判断鸭蛋是否新鲜 判断鸭蛋是否新鲜的方法
  • 2023-02-26 19:47:20出发!西安至紫阳首发旅游专列!【959关注】
  • 2023-02-26 19:39:38怎样提高孩子的理解能力 如何提高孩子的理解能力
  • 2023-02-26 19:37:52天天速讯:四川为什么被称为鸡省 四川被称为鸡省的原因
  • 2023-02-26 19:35:46豆腐怎么吃又入味又好吃 豆腐最好吃的做法
  • 2023-02-26 19:27:19世界今日讯!黄帝和炎帝被称为什么 黄帝和炎帝简单介绍
  • 2023-02-26 19:01:42环球微速讯:“后排男孩”火了!网友:这就是青春啊
  • 2023-02-26 18:46:51全球焦点!年供 1.45 亿度绿色电能,陕西最大山地光伏电站正式并网发电
  • 2023-02-26 18:44:30“社区+N”民主协商议事会 巧解居民“疑难杂症”问题
  • 2023-02-26 18:08:41今日快看!树洞画 为三江六岸添色彩
  • 2023-02-26 18:04:17天天速读:租赁豪车后质押骗取贷款 父子俩获刑
  • 2023-02-26 18:02:43全球观察:风劲潮急,江苏盐城激活“蓝色引擎”
  • 2023-02-26 18:01:28天天观速讯丨男子在自家鱼塘电鱼被罚?四川宜宾警方?已撤销处罚并向当事人道歉
  • 2023-02-26 17:53:01当前信息:期待!汉中油菜花海美景来袭!启动仪式就在这个村
  • 2023-02-26 17:50:53越吃越“上头”?油炸食品到底能不能吃?
  • 2023-02-26 17:13:44全球热资讯!长三角高铁网示意图来了 5个项目今年开通!
  • 2023-02-26 17:12:18百事通!4年“接”来超16万员工 江苏昆山稳岗保产护航“企业敢干”
  • 2023-02-26 17:08:09环球关注:致1人死亡!江苏省住建厅通报一起工地事故
  • 2023-02-26 17:01:13今日热闻!找回网
  • 2023-02-26 16:59:37每日热点:蓝田县气象台继续发布大风蓝色预警【Ⅳ级/一般】【2023-02-26】
  • 2023-02-26 16:56:58世界时讯:不负春光,驭风前行!淮安经开区一季度重特大项目集中开工
  • 2023-02-26 16:56:02江苏:2025年,新型电力和新能源装备重点产业链水平明显提升
  • 2023-02-26 16:48:59四川南江发生一起非煤矿山顶板事故 已致5死3重伤
  • 2023-02-26 16:13:38江苏苏州:“红色磁场”提升产业集群发展引领力
  • 2023-02-26 16:11:10天天速递!苏州吴江:破解关键技术难题,打造化纤“国之重器”!
  • 2023-02-26 16:05:33环球即时看!苏州居民人均可支配收入首破7万元
  • 2023-02-26 16:00:32环球微动态丨大连读行兵发苏州,将通过多场热身赛磨合阵容,引援工作仍在继续
  • 2023-02-26 15:11:33【天天速看料】吹寄制理
  • 2023-02-26 15:08:14美军机带着记者窜扰南海 解放军战机霸气警告
  • 2023-02-26 14:54:06全球看热讯:安徽应急管理厅:亳蒙高速一工地发生土方坍塌事故 致3死4伤
  • 2023-02-26 14:50:22观察:港交所3月将修改主板上市规则 无盈利科技公司可来港上市
  • 2023-02-26 14:47:21环球新资讯:保洁员捡到2万现金报警后被开除?多方回应
  • 2023-02-26 14:44:58各大机构领投参与 BOFT于2023年3月正式全球启动
  • 2023-02-26 14:15:20当前短讯!加快推进全球招商!扬州公布经济发展目标
  • 2023-02-26 14:10:59焦点热门:南京江北新区水环境提升项目,获 “国家优质工程奖”
  • 2023-02-26 14:06:44追“高”逐“新”!常州新能源之都全链起势!
  • 2023-02-26 14:03:01全球信息:蔡天凤被碎尸案进展:前夫哥哥及父亲被控谋杀
  • 2023-02-26 13:52:27浓烟滚滚!广西著名景区突发大火 官方通报
  • 2023-02-26 13:51:02北京流感病例数超新冠,流感是否会与新冠叠加影响?
  • 2023-02-26 12:06:39环球最新:小模型承载科技大梦想 这场竞赛,“海陆空建”都来了
  • 2023-02-26 12:01:00快资讯丨破解无人带娃窘境 玉景湾社区提供免费临时托幼服务
  • 2023-02-26 11:55:01每日动态!女子称雷瓦卷发棒爆炸致手臂二度烫伤 厂家:要赔钱需删帖
  • 2023-02-26 11:46:47环球快资讯丨巴菲特股东信十大看点:累计回报3.79万倍
  • 2023-02-26 11:45:47全球热讯:极危物种青头潜鸭现身花桥 天福国家湿地公园鸟类已提升至216种
  • 2023-02-26 11:44:50江苏公布1月县(市、区)地表水环境质量排名 吴江水质指数全省第一
  • 2023-02-26 11:44:49南宽坪镇:不负农时不负春 粮经并举促增收
  • 2023-02-26 11:07:53【天天报资讯】中国留学生遭男友杀害!校方赔500万美元 父母发声……
  • 2023-02-26 11:01:14中国银行江苏省分行实现数字人民币诉讼费缴纳主渠道全面落地
  • 2023-02-26 10:57:46丈夫被妻子误伤未责怪反安慰妻子 玩笑归玩笑不要动剪刀
  • 2023-02-26 10:56:37今日热搜:“安全骑行 平安送达” 苏州工业园区唯亭街道开展“心系新业态 社区送温暖”主题志愿活动
  • 2023-02-26 10:46:08【世界报资讯】西安经开区:北客站广场管理中心召开纪律作风整顿动员大会
  • 2023-02-26 10:10:22总额5亿元!下月发放!
  • 2023-02-26 10:08:22旅美大熊猫乐乐死因初步确定 中方已为接返熊猫丫丫做好准备
  • 2023-02-26 09:59:30揉胸除灵师
  • 2023-02-26 09:48:31热文:喀麦隆一分离主义武装团体宣称对登山跑步比赛爆炸事件负责
  • 2023-02-26 09:14:22轿车翻入河中,40余名村民上演“拔河式”救援
  • 2023-02-26 09:11:24世界热门:两部门发文!事关住房租赁、购房贷款
  • 2023-02-26 09:09:58世界头条:传染性强!此病进入高发期 中疾控最新提醒!
  • 2023-02-26 09:09:28天天讯息:新小学、新商街、新园区……这些落户武汉新城的项目年内投用
  • 2023-02-26 09:08:48【速看料】不合理低价游苗头再显:声称0元游 1个景点搭配5个购物点
  • 2023-02-26 09:07:40最资讯丨商丘公交停运风波进展:司机发工资了
  • 2023-02-26 09:03:32环球热门:探索“镜头”秘密,定格春日“梅”好!扬子晚报苏州小记者“春日光影”户外摄影实践课圆满举行
  • 2023-02-26 09:02:17环球短讯!武汉地铁今起再调整!涉及3条线路
  • 2023-02-26 09:01:59世界最资讯丨重磅!湖北一地公积金政策有调整
  • 2023-02-26 09:01:24今日热讯:湖北冲刺规上工业企业研发机构覆盖率37%
  • 2023-02-26 08:57:26俄罗斯暂停通过“友谊”管道向波兰输送原油
  • 2023-02-26 08:52:28环球即时看!西安市中心医院组织召开2022年度医改工作总结暨2023年度整体工作推进会
  • 2023-02-26 08:14:15全省第4!南通市截止去年末常住人口为774.35万人
  • 2023-02-26 08:09:47【世界独家】苏宁环球:第一大股东权益变动-5%,减持计划尚未实施完毕
  • 2023-02-26 08:06:23【世界独家】江苏检察机关依法对曹广晶涉嫌受贿、泄露内幕信息案提起公诉
  • 2023-02-26 07:56:14天天速读:全省第二!南通16家企业通过“江苏精品”认证
    • 苏州
    • 江苏
    • 财经
    • 娱乐
    • 旅游
    • 时尚

    江苏公布1月县(市、

    全球观察:风劲潮急,

    山姆回应卖399元山寨

    天天速讯:重磅!潘集

    九寨沟国庆遇冷7天迎

    唤醒植物人丈夫的女孩

    最新资讯

  • 最早将在4月底发射 龙飞船有望成首个载人商业航天器
  • 又见高空坠物 这次扔下来的竟然是玻璃茶几
  • 苏州轨道交通3号线今起空载试运行 将于12月底试运营
  • 十四台高水准音乐演出 江南之声,以音乐节的名义致敬古典
  • 2019江苏省“长江经济带”全民健身大联动暨“舞动江苏”无锡赛区启动仪式举行
  • 以合作致共赢 江苏日本开放创新合作交流会在东京举行
  • 走进江苏各地博物馆 寻找文物上的“萌娃”们
  • 新沂城市水环尽显生态活力:碧水绕城 绿荫满城
  • “强网”拟态防御国际精英挑战赛:29支“白帽黑客”战队谁能突防?
  • 南京楼市上半年推房或超去年全年
  • 银行Ⅰ类账户每天交易限额5000元?多家银行回应
  • 中疾控:去年12月至今年2月23日共发现本土重点关注变异株22例
  • “要幸福哦!”日本民众挥泪告别熊猫香香 中国网友发出邀请
  • 江苏宿迁:中心城区购商品住房给予购房补贴,契税最高补贴100%
  • 国家市监总局通报食品抽检15批次不合格!江苏三家公司上榜
  • 世界看点:【宝鸡范儿】巨幅墙画、红砖建筑群落……新民路街区 “大变脸”
  • 全球热头条丨熊向东
  • 当前消息!墨西哥媒体:奥乔亚愿意担任替补,他吸引了米兰双雄的关注
  • 营造"苏式"爱才氛围 苏州高层次人才服务贯穿全年
  • 【环球播资讯】丨INTO1苏州音乐会饭拍诠释百分百帅气!
  • 全球热文:土耳其:已对涉嫌参与建造劣质建筑的人发出逮捕令
  • 世界热点评!周知!这些方式都能落户苏州!哪种最适合你?
  • 数字苏州标准化工作专班召开今年首次会议
  • 盐城盐都赴苏州招商推介,成功签约18个项目
  • 德邦证券金华龙重视人才发展!多地打造旗舰中心及精英团队
  • 西安第六座万达广场来了!落户灞桥!
  • 天天快资讯丨协和电子:股东曹良良减持公司股份计划完成,减持约38万股
  • 【聚看点】华商记者帮|同一小区水电费价格分三档 业主购房五年不知何人在收费
  • 【快播报】让响器木偶活起来 宁波81岁非遗传承人接了一笔"大单"
  • 每日热闻!跑步多久才能起到减肥的作用_跑步腿会变粗吗
  • 涨幅领跑全国,二手房是“雄起”还是“仰卧起坐”?
  • 世界热资讯!宿迁房地产新政出台:取消住房公积金异地贷款户籍地限制
  • 当前热门:吹响“冲锋号” 奋进“春天里”!盐城67个城乡建设重点项目开工
  • 天天视点!江苏省属事业单位统一公开招聘:2023年毕业生可报名岗位达81.78%
  • 当前速看:广西一校园捞起7500斤鱼 免费给师生们品尝
  • 每日播报!跨越十年新突破,南京江北新区崛起国家级创新型产业集群
  • 新华全媒+|陕西:“小修小补”回归社区助残疾人就近就业
  • 环球速递!祝贺!中国科学家首次实现小鼠“深脑成像”
  • 援建土耳其!苏州吴江“力量”又出发!
  • 速看:港媒称蔡天凤被碎尸案主谋为前夫父亲:反侦察能力强 曾卷入强奸案
  • 订购1.2万+台!商用车新能源首届创富+高峰论坛暨开瑞小象EV上市圆满落幕
  • 禁毒宣传紧扣南京地域文化 “禁毒杯”南京定向赛越办越牛
  • 多条道路改造,研究二孩家庭购房政策……镇江今年投资185.8亿要干这些事
  • 警惕!尤其是苹果手机用户 多地警方已发布预警
  • 当前关注:南京银行推出“二十条举措” 助力江苏经济运行率先整体好转
  • 当前快讯:绿“智造” 创未来!松下冷热电三联供氢能示范项目在无锡启用
  • 【世界新要闻】中国即将开始准备选拔国际航天员 已有多个国家提出飞行需求
  • 今日热闻!中国邮政储蓄银行有限责任公司随州市分行
  • 今日热闻!全国首家服务机器人应用体验中心在扬州上线
  • 抢跑“春天里”!盐城盐都区赴苏州签约18个项目
  • 江苏三设区市发布楼市新政:限购限售松绑,支持改善性需求
  • 即时看!抢抓数字经济时代机遇!江苏银行与蚂蚁集团签署战略合作协议
  • 环球资讯:动态调整住房贷款利率 多地开启“商转公”
  • 层层放哨多个关卡 渭南澄城打掉农村地下赌场抓获40人
  • 【世界聚看点】铜川:新增6个绿色食品
  • 新消息丨江苏苏州:按下春季田管春耕备耕“快进键”
  • “领导留言板”回复量、满意度全省第一 周旭东:打造网络问政“苏州范式”
  • 热门看点:这只猴因“长相炸裂”火上热搜 动物园回应…
  • 把风水学当成炒股“万灵药”:既违背科学原理,又误导投资者
  • 南宋“平江官窑”在相城?或为苏州目前发现的唯一制陶官窑
  • 天天精选!可别一口一块撑腰糕了 小心“食糕团综合征”吃坏肚子
  • 全球热推荐:周至公安开展“空中+地面”禁种铲毒踏查行动
  • 江苏检察机关依法对曹广晶涉嫌受贿、泄露内幕信息案提起公诉
  • 天天速讯:重磅!潘集电厂一期全面投产!
  • 天天快资讯丨关注罕见 点亮生命之光——西安交大一附院国际罕见病日多学科联合义诊活动来啦
  • 全球观察:陕西省华阴市发布大风蓝色预警
  • 买了个寂寞?女子7万买银行的理财竟亏300
  • 天天快资讯:首都师范大学强迫学生献血?官方辟谣 用了“18个问号+9个叹号”
  • 速看:营养餐给山区孩子带来了什么?他的讲述感动无数网友
  • 世界实时:西安端履门一路段地面下陷,路过车主:真坑人!有关部门回应
  • 火影之永恒记忆_火影之永恒记忆
  • 内蒙古煤矿坍塌事故东西两侧救援通道已全部打通
  • 小美到家
  • 天天观察:让群众健康有“医”靠 “一站一品”义诊服务不断档
  • “让博物馆赋能美好生活”——陕历博“流动博物馆”走进百姓身边
  • 香港名媛蔡天凤遭谋杀 凶手手段极其残忍…警方已拘捕3名嫌疑人
  • 全球观热点:开源节流破解“停车难” 常熟古里镇新增200余个智能化泊位
  • “赶集”式体验文明实践 吴中木渎呈上各类惠民服务
  • 通知!今年清明节不调休 劳动节放假五天
  • 热议:拜登曾称美国有摧毁台湾计划?中方:美方应做出解释
  • 五个项目获得投资意向“苏创学堂”苏州创新创业大赛投融资对接会持续进行中!
  • 世界讯息:临沂:大棚桃花开 蜜蜂“打工”来
  • 每日关注!陕西省西安市发布大风蓝色预警
  • 焦点速讯:合阳县气象台发布大风蓝色预警【Ⅳ级/一般】【2023-02-25】
  • 刚刚!两地突发地震,震感明显!多人梦中惊醒
  • 内置多项实用功能,科大讯飞AI学习机值得孩子们入手
  • 当前简讯:马术进校园,学生乐开花
  • 恩施的春天约起|恩施旅游喜迎今年首批“万人团”
  • 环球即时:【奋进的春天】走起!界头庙镇的樱桃花开了
  • 厉害了!新一代载人登月飞船模型首次展出
  • 今日关注:东湖绿道游人如织,停车场“下饺子”
  • 世界最资讯丨骗子为骗钱竟伪造了一整个派出所?温州警方回应确有此事
  • 世界热推荐:西安绕城高速通行方式有变!效果如何?
  • 当前观察:襄阳市纪委监委通报6起粮食购销领域违纪违法典型案例
  • 世界快资讯:武汉等城市“2万亿俱乐部”劳动人口可持续竞争力报告发布
  • 环球实时:警方调查明星健康宝照片泄露 什么是健康宝?什么情况?
  • 三大高速年内通车!2023年,武汉交通投资650亿元
  • 每日热文:稳预期 扩内需 促消费|巧用税收大数据 为企业“牵线补链”
  • 环球精选!今起,武汉地铁2号线休息日行车间隔缩短!
  • 即将发放!湖北消费券有新变化
  • 世界看热讯:3月26日起,武汉“上新”新航线!
  • 世界球精选!“女子买过期大米索赔被殴”引热议 该不该支持职业打假人?
  • 世界观察:让“招商大使”成为安庆“推荐官”
  • 无岳高速有望今年年内建成通车
  • 世界热消息:5号线列车怎么跑,由您来决定!
  • 天天速递!合肥西站建设迎来新进展
  • 全球简讯:家长称12岁男孩半个月游戏充值2万 向苹果申请退款两次被拒
  • 合肥市举办2023年首场产业融合对接会
  • 全球动态:今年西咸新区推进14条互联互通道路建设
  • 天天快报!泽维尔亨利