首页 > 滚动 > > 内容页

【ES三周年】2 万字长文,带你深入理解 Elasticsearch

2023-02-24 04:12:55 腾讯云

本篇主要内容如下:


【资料图】

主要内容

前言

项目中我们总是用 Kibana界面来搜索测试或生产环境下的日志,来看下有没有异常信息。Kibana就是 我们常说的 ELK中的 K

Kibana 界面如下图所示:

Kibana 界面

但这些日志检索原理是什么呢?这里就该我们的 Elasticsearch 搜索引擎登场了。

我会分为三篇来讲解 Elasticsearch(简称ES)的原理、实战及部署。

上篇:讲解 ES 的原理、中文分词的配置。中篇:实战 ES 应用。下篇:ES 的集群部署。

为什么要分成三篇,因为每一篇都很长,而且侧重点不一样,所以分成三篇来讲解。

一、Elasticsearch 简介

1.1 什么是 Elasticsearch?

Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。简单来说只要涉及搜索和分析相关的, ES 都可以做。

1.2 Elasticsearch 的用途?

Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,这意味着其可用于多种用例:

比如一个在线网上商店,您可以在其中允许客户搜索您出售的产品。在这种情况下,您可以使用Elasticsearch 存储整个产品目录和库存,并为它们提供搜索和自动完成建议。
搜索手机
比如收集日志或交易数据,并且要分析和挖掘此数据以查找趋势,统计信息,摘要或异常。在这种情况下,您可以使用 Logstash(Elasticsearch / Logstash / Kibana堆栈的一部分)来收集,聚合和解析数据,然后让 Logstash 将这些数据提供给 Elasticsearch。数据放入 Elasticsearch 后,您可以运行搜索和聚合以挖掘您感兴趣的任何信息。

1.3 Elasticsearch 的工作原理?

ELK 原理图

Elasticsearch 是在 Lucene 基础上构建而成的。ES 在 Lucence 上做了很多增强。

Lucene 是apache软件基金会 4 的 jakarta 项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。(来自百度百科)

Elasticsearch 的原始数据从哪里来?

原始数据从多个来源 ( 包括日志、系统指标和网络应用程序 ) 输入到 Elasticsearch 中。

Elasticsearch 的数据是怎么采集的?

数据采集指在 Elasticsearch 中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch 中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。这里用到了 Logstash,后面会介绍。

怎么可视化查看想要检索的数据?

这里就要用到 Kibana 了,用户可以基于自己的数据进行搜索、查看数据视图等。

1.4 Elasticsearch 索引是什么?

Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组键 ( 字段或属性的名称 ) 和它们对应的值 ( 字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据 ) 之间建立联系。

Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。

在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。

1.5 Logstash 的用途是什么?

Logstash 就是 ELK中的 L

Logstash 是 Elastic Stack 的核心产品之一,可用来对数据进行聚合和处理,并将数据发送到 Elasticsearch。Logstash 是一个开源的服务器端数据处理管道,允许您在将数据索引到 Elasticsearch 之前同时从多个来源采集数据,并对数据进行充实和转换。

1.6 Kibana 的用途是什么?

Kibana 是一款适用于 Elasticsearch 的数据可视化和管理工具,可以提供实时的直方图、线性图等。

1.7 为什么使用 Elasticsearch

ES 很快,近实时的搜索平台。ES 具有分布式的本质特质。ES 包含一系列广泛的功能,比如数据汇总和索引生命周期管理。

官方文档:https://www.elastic.co/cn/what-is/elasticsearch

二、ES 基本概念

2.1 Index ( 索引 )

动词:相当于 Mysql 中的 insert

名词:相当于 Mysql 中的 database

与 mysql 的对比

序号

Mysql

Elasticsearch

1

Mysql 服务

ES 集群服务

2

数据库 Database

索引 Index

3

表 Table

类型 Type

4

记录 Records ( 一行行记录 )

文档 Document ( JSON 格式 )

2.2 倒排索引

假如数据库有如下电影记录:

1-大话西游

2-大话西游外传

3-解析大话西游

4-西游降魔外传

5-梦幻西游独家解析

分词:将整句分拆为单词

序号

保存到 ES 的词

对应的电影记录序号

A

西游

1,2, 3,4, 5

B

大话

1,2, 3

C

外传

2,4, 5

D

解析

3,5

E

降魔

4

F

梦幻

5

G

独家

5

检索:独家大话西游

独家大话西游解析拆分成 独家大话西游

ES 中 A、B、G 记录 都有这三个词的其中一种, 所以 1,2, 3,4, 5 号记录都有相关的词被命中。

1 号记录命中 2 次, A、B 中都有 ( 命中 2次 ) ,而且 1 号记录有 2个词,相关性得分:2次/2个词=1

2 号记录命中 2 个词 A、B 中的都有 ( 命中 2次 ) ,而且 2 号记录有 2个词,相关性得分:2次/3个词= 0.67

3 号记录命中 2 个词 A、B 中的都有 ( 命中 2次 ) ,而且 3 号记录有 2个词,相关性得分:2次/3个词= 0.67

4 号记录命中 2 个词 A 中有 ( 命中 1次 ) ,而且 4 号记录有 3个词,相关性得分:1次/3个词= 0.33

5 号记录命中 2 个词 A 中有 ( 命中 2次 ) ,而且 4 号记录有 4个词,相关性得分:2次/4个词= 0.5

所以检索出来的记录顺序如下:

1-大话西游 ( 想关性得分:1 )
2-大话西游外传 ( 想关性得分:0.67 )
3-解析大话西游 ( 想关性得分:0.67 )
5-梦幻西游独家解析 ( 想关性得分:0.5 )
4-西游降魔 ( 想关性得分:0.33 )

三、Docker 搭建环境

3.1. 搭建 Elasticsearch 环境

搭建虚拟机环境和安装 docker 可以参照之前写的文档:

01. 快速搭建 Linux 环境-运维必备02. 配置虚拟机网络03. 安装 Docker

1 ) 下载镜像文件

docker pull elasticsearch:7.4.2

2 ) 创建实例

映射配置文件
配置映射文件夹mkdir -p /mydata/elasticsearch/config配置映射文件夹mkdir -p /mydata/elasticsearch/data设置文件夹权限任何用户可读可写chmod 777 /mydata/elasticsearch -R配置 http.hostecho "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
启动 elasticsearch 容器
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \-e "discovery.type"="single-node" \-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \-d elasticsearch:7.4.2
访问 elasticsearch 服务

访问:http://192.168.56.10:9200

返回的 reponse

{  "name" : "8448ec5f3312",  "cluster_name" : "elasticsearch",  "cluster_uuid" : "xC72O3nKSjWavYZ-EPt9Gw",  "version" : {    "number" : "7.4.2",    "build_flavor" : "default",    "build_type" : "docker",    "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",    "build_date" : "2019-10-28T20:40:44.881551Z",    "build_snapshot" : false,    "lucene_version" : "8.2.0",    "minimum_wire_compatibility_version" : "6.8.0",    "minimum_index_compatibility_version" : "6.0.0-beta1"  },  "tagline" : "You Know, for Search"}

访问:http://192.168.56.10:9200/_cat 访问节点信息

127.0.0.1 62 90 0 0.06 0.10 0.05 dilm * 8448ec5f3312

3.2. 搭建 Kibana 环境

docker pull kibana:7.4.2docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.4.2

访问 kibana: http://192.168.56.10:5601/

kibana

四、初阶检索玩法

4.1._cat 用法

GET /_cat/nodes: 查看所有节点GET /_cat/health: 查看 es 健康状况GET /_cat/master: 查看主节点GET /_cat/indices: 查看所有索引查询汇总:/_cat/allocation/_cat/shards/_cat/shards/{index}/_cat/master/_cat/nodes/_cat/tasks/_cat/indices/_cat/indices/{index}/_cat/segments/_cat/segments/{index}/_cat/count/_cat/count/{index}/_cat/recovery/_cat/recovery/{index}/_cat/health/_cat/pending_tasks/_cat/aliases/_cat/aliases/{alias}/_cat/thread_pool/_cat/thread_pool/{thread_pools}/_cat/plugins/_cat/fielddata/_cat/fielddata/{fields}/_cat/nodeattrs/_cat/repositories/_cat/snapshots/{repository}/_cat/templates

4.2. 索引一个文档 ( 保存 )

例子:在 customer索引下的 external类型下保存标识为 1的数据。

使用 Kibana 的 Dev Tools 来创建
PUT member/external/1{"name":"jay huang"}

Reponse:

{    "_index": "member", //在哪个索引    "_type": "external",//在那个类型    "_id": "2",//记录 id    "_version": 7,//版本号    "result": "updated",//操作类型    "_shards": {        "total": 2,        "successful": 1,        "failed": 0    },    "_seq_no": 9,    "_primary_term": 1}
也可以通过 Postman 工具发送请求来创建记录。
创建一条记录

注意:

PUT 和 POST 都可以创建记录。

POST:如果不指定 id,自动生成 id。如果指定 id,则修改这条记录,并新增版本号。

PUT:必须指定 id,如果没有这条记录,则新增,如果有,则更新。

4.3 查询文档

请求:http://192.168.56.10:9200/member/external/2Reposne:{    "_index": "member",   //在哪个索引    "_type": "external",  //在那个类型    "_id": "2",           //记录 id    "_version": 7,        //版本号    "_seq_no": 9,         //并发控制字段,每次更新就会+1,用来做乐观锁    "_primary_term": 1,   //同上,主分片重新分配,如重启,就会变化    "found": true,    "_source": { //真正的内容        "name": "jay huang" }}

_seq_no 用作乐观锁

每次更新完数据后,_seq_no 就会+1,所以可以用作并发控制。

当更新记录时,如果_seq_no 与预设的值不一致,则表示记录已经被至少更新了一次,不允许本次更新。

用法如下:

请求更新记录 2: http://192.168.56.10:9200/member/external/2?if_seq_no=9&&if_primary_term=1返回结果:{    "_index": "member",    "_type": "external",    "_id": "2",    "_version": 9,    "result": "updated",    "_shards": {        "total": 2,        "successful": 1,        "failed": 0    },    "_seq_no": 11,    "_primary_term": 1}

_seq_no 等于 10,且_primary_term=1 时更新数据,执行一次请求后,再执行上面的请求则会报错:版本冲突

{    "error": {        "root_cause": [ {                "type": "version_conflict_engine_exception",                "reason": "[2]: version conflict, required seqNo [10], primary term [1]. current document has seqNo [11] and primary term [1]",                "index_uuid": "CX6uwPBKRByWpuym9rMuxQ",                "shard": "0",                "index": "member" }        ],        "type": "version_conflict_engine_exception",        "reason": "[2]: version conflict, required seqNo [10], primary term [1]. current document has seqNo [11] and primary term [1]",        "index_uuid": "CX6uwPBKRByWpuym9rMuxQ",        "shard": "0",        "index": "member"    },    "status": 409}

4.4 更新文档

用法

POST 带 _update的更新操作,如果原数据没有变化,则 repsonse 中的 result 返回 noop ( 没有任何操作 ) ,version 也不会变化。

请求体中需要用 doc将请求数据包装起来。

POST 请求:http://192.168.56.10:9200/member/external/2/_update{    "doc":{        "name":"jay huang" }}响应:{    "_index": "member",    "_type": "external",    "_id": "2",    "_version": 12,    "result": "noop",    "_shards": {        "total": 0,        "successful": 0,        "failed": 0    },    "_seq_no": 14,    "_primary_term": 1}

使用场景:对于大并发更新,建议不带 _update。对于大并发查询,少量更新的场景,可以带_update,进行对比更新。

更新时增加属性

请求体中增加 age属性

http://192.168.56.10:9200/member/external/2/_updaterequest:{    "doc":{        "name":"jay huang",        "age": 18 }}response:{    "_index": "member",    "_type": "external",    "_id": "2",    "_version": 13,    "result": "updated",    "_shards": {        "total": 2,        "successful": 1,        "failed": 0    },    "_seq_no": 15,    "_primary_term": 1}

4.5 删除文档和索引

删除文档
DELETE 请求:http://192.168.56.10:9200/member/external/2response:{    "_index": "member",    "_type": "external",    "_id": "2",    "_version": 2,    "result": "deleted",    "_shards": {        "total": 2,        "successful": 1,        "failed": 0    },    "_seq_no": 1,    "_primary_term": 1}
删除索引
DELETE 请求:http://192.168.56.10:9200/memberrepsonse:{    "acknowledged": true}
没有删除类型的功能

4.6 批量导入数据

使用 kinaba 的 dev tools 工具,输入以下语句

POST /member/external/_bulk{"index":{"_id":"1"}}{"name":"Jay Huang"}{"index":{"_id":"2"}}{"name":"Jackson Huang"}

执行结果如下图所示:

批量插入数据
拷贝官方样本数据

https://raw.githubusercontent.com/elastic/elasticsearch/master/docs/src/test/resources/accounts.json

官方样本数据
在 kibana 中执行脚本
POST /bank/account/_bulk{"index":{"_id":"1"}}{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}{"index":{"_id":"6"}}......
批量插入样本数据的执行结果
查看所有索引
查看所有索引

可以从返回结果中看到 bank 索引有 1000 条数据,占用了 440.2kb 存储空间。

五、高阶检索玩法

5.1 两种查询方式

5.1.1 URL 后接参数

GET bank/_search?q=*&sort=account_number: asc
`/_search?q=*&sort=account_number: asc`查询出所有数据,共 1000 条数据,耗时 1ms,只展示 10 条数据 ( ES 分页 )
URL 后接参数

took – ES 执行搜索的时间 ( 毫秒 )

timed_out – ES 是否超时

_shards – 有多少个分片被搜索了,以及统计了成功/失败/跳过的搜索的分片

max_score – 最高得分

hits.total.value - 命中多少条记录

hits.sort - 结果的排序 key 键,没有则按 score 排序

hits._score - 相关性得分

参考文档:

https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started-search.html

### 5.1.2 URL 加请求体进行检索 ( QueryDSL )请求体中写查询条件语法:```json
GET bank/_search{  "query":{"match_all": {}},  "sort": [{"account_number": "asc" } ]}
示例:查询出所有,先按照 accout_number 升序排序,再按照 balance 降序排序![URL 加请求体进行检索](https://img-blog.csdnimg.cn/img_convert/c33eabc7d153f503f3dbf0aff73da9b0.png)## 5.2 详解 QueryDSL 查询> DSL: Domain Specific Language### 5.2.1 全部匹配 match_all示例:查询所有记录,按照 balance 降序排序,只返回第 11 条记录到第 20 条记录,只显示 balance 和 firstname 字段。```json
GET bank/_search{  "query": {"match_all": {}  },  "sort": [ {  "balance": {    "order": "desc" } }  ],  "from": 10,  "size": 10,  "_source": "balance", "firstname"}
### 5.2.2 匹配查询 match-   基本类型 ( 非字符串 ) ,精确匹配```json
GET bank/_search{  "query": {"match": {"account_number": "30"} }}-   字符串,全文检索```jsonGET bank/_search{  "query": {"match": {  "address": "mill road" } }}
![字符串全文检索](https://img-blog.csdnimg.cn/img_convert/756f17278649ba144523a516127b0c06.png)> 全文检索按照评分进行排序,会对检索条件进行分词匹配。>> 查询 `address` 中包含 `mill` 或者 `road` 或者 `mill road` 的所有记录,并给出相关性得分。查到了 32 条记录,最高的一条记录是 Address = "990 Mill Road",得分:8.926605. Address="198 Mill Lane" 评分 5.4032025,只匹配到了 Mill 单词。### 5.2.3 短语匹配 match_phase将需要匹配的值当成一个整体单词 ( 不分词 ) 进行检索```json
GET bank/_search{  "query": {"match_phrase": {  "address": "mill road" } }}> 查出 address 中包含 `mill road` 的所有记录,并给出相关性得分### 5.2.4 多字段匹配 multi_match```jsonGET bank/_search{  "query": {
"multi_match": {  "query": "mill land",  "fields": [    "state",    "address" ] } }}
> multi_match 中的 query 也会进行分词。>> 查询 `state` 包含 `mill` 或 `land` 或者 `address` 包含 `mill` 或 `land` 的记录。### 5.2.5 复合查询 bool> 复合语句可以合并任何其他查询语句,包括复合语句。复合语句之间可以相互嵌套,可以表达复杂的逻辑。搭配使用 must,must_not,shouldmust: 必须达到 must 指定的条件。 ( 影响相关性得分 )must_not: 必须不满足 must_not 的条件。 ( 不影响相关性得分 )should: 如果满足 should 条件,则可以提高得分。如果不满足,也可以查询出记录。 ( 影响相关性得分 )示例:查询出地址包含 mill,且性别为 M,年龄不等于 28 的记录,且优先展示 firstname 包含 Winnie 的记录。```json
GET bank/_search{  "query": {"bool": {  "must": [ {      "match": {        "address": "mill" }    }, {      "match": {        "gender": "M" } }  ],  "must_not": [ {      "match": {        "age": "28" } }  ],  "should": [ {      "match": {        "firstname": "Winnie" } } ] } }}
### 5.2.6 filter 过滤> 不影响相关性得分,查询出满足 filter 条件的记录。>> 在 bool 中使用。```json
GET bank/_search{  "query": {"bool": {  "filter": [ {      "range": {        "age": {          "gte":18,          "lte":40 } ] }
### 5.2.7 term 查询> 匹配某个属性的值。>> 全文检索字段用 match,其他非 text 字段匹配用 term>> keyword:文本精确匹配 ( 全部匹配 )>> match_phase:文本短语匹配```json非 text 字段精确匹配GET bank/_search{  "query": {"term": {  "age": "20" }
### 5.2.8 aggregations 聚合> 聚合:从数据中分组和提取数据。类似于 SQL GROUP BY 和 SQL 聚合函数。>> Elasticsearch 可以将命中结果和多个聚合结果同时返回。聚合语法:```json"aggregations" : {"<聚合名称 1>" : {    "<聚合类型>" : {        <聚合体内容>    }    [,"元数据" : {  [] }]?    [,"aggregations" : { []+ }]?}[,"聚合名称 2>" : { ... }]*}-   示例 1:搜索 address 中包含 big 的所有人的年龄分布 ( 前 10 条 ) 以及平均年龄,以及平均薪资```jsonGET bank/_search{  "query": {"match": {  "address": "mill" }  },  "aggs": {"ageAggr": {  "terms": {    "field": "age",    "size": 10   }},"ageAvg": {  "avg": {    "field": "age"  }},"balanceAvg": {  "avg": {    "field": "balance"  }   } }}
检索结果如下所示:hits 记录返回了,三种聚合结果也返回了,平均年龄 34 随,平均薪资 25208.0,品骏年龄分布:38 岁的有 2 个,28 岁的有一个,32 岁的有一个![示例 1](https://img-blog.csdnimg.cn/img_convert/0a2b0009deae81ce30b99c430e29bf35.png)如果不想返回 hits 结果,可以在最后面设置 size:0```jsonGET bank/_search{  "query": {"match": {  "address": "mill" }  },  "aggs": {"ageAggr": {  "terms": {    "field": "age",    "size": 10  }}  },  "size": 0}-   示例 2:按照年龄聚合,并且查询这些年龄段的平均薪资从结果可以看到 31 岁的有 61 个,平均薪资 28312.9,其他年龄的聚合结果类似。![示例 2](https://img-blog.csdnimg.cn/img_convert/006ea6426d3d9fb5b74a123bf3099f84.png)-   示例 3:按照年龄分组,然后将分组后的结果按照性别分组,然后查询出这些分组后的平均薪资```jsonGET bank/_search{  "query": {"match_all": { }  },  "aggs": {"ageAggr": {  "terms": {    "field": "age",    "size": 10  },  "aggs": {    "genderAggr": {      "terms": {        "field": "gender.keyword",        "size": 10      },      "aggs": {        "balanceAvg": {          "avg": {            "field": "balance"      }    }  }}  } }  },  "size": 0}
从结果可以看到 31 岁的有 61 个。其中性别为 `M` 的 35 个,平均薪资 29565.6,性别为 `F` 的 26 个,平均薪资 26626.6。其他年龄的聚合结果类似。![聚合结果](https://img-blog.csdnimg.cn/img_convert/28f9173a3634bcc2829783f9a89d4053.png)### 5.2.9 Mapping 映射> Mapping 是用来定义一个文档 ( document ) ,以及它所包含的属性 ( field ) 是如何存储和索引的。-   定义哪些字符串属性应该被看做全文本属性 ( full text fields )-   定义哪些属性包含数字,日期或地理位置-   定义文档中的所有属性是否都能被索引 ( _all 配置 )-   日期的格式-   自定义映射规则来执行动态添加属性Elasticsearch7 去掉 tpye 概念:关系型数据库中两个数据库表示是独立的,即使他们里面有相同名称的列也不影响使用,但 ES 中不是这样的。elasticsearch 是基于 Lucence 开发的搜索引擎,而 ES 中不同 type 下名称相同的 field 最终在 Lucence 中的处理方式是一样的。为了区分不同 type 下的同一名称的字段,Lucence 需要处理冲突,导致检索效率下降ES7.x 版本:URL 中的 type 参数为可选。ES8.x 版本:不支持 URL 中的 type 参数所有类型可以参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html-   查询索引的映射如查询 my-index 索引的映射```json
GET /my-index/_mapping返回结果:{  "my-index" : {"mappings" : {  "properties" : {    "age" : {      "type" : "integer"    },    "email" : {      "type" : "keyword"    },    "employee-id" : {      "type" : "keyword",      "index" : false    },    "name" : {      "type" : "text"  }}  }
-   创建索引并指定映射如创建 my-index 索引,有三个字段 age,email,name,指定类型为 interge, keyword, text```jsonPUT /my-index{  "mappings": {"properties": {  "age": { "type": "integer" },  "email": { "type": "keyword"  },  "name": { "type": "text" }}

返回结果:

{  "acknowledged" : true,  "shards_acknowledged" : true,  "index" : "my-index"}
-   添加新的字段映射如在 my-index 索引里面添加 employ-id 字段,指定类型为 keyword```jsonPUT /my-index/_mapping{  "properties": {"employee-id": {  "type": "keyword",  "index": false} }}
-   更新映射> 我们不能更新已经存在的映射字段,必须创建新的索引进行数据迁移。-   数据迁移```jsonPOST _reindex{  "source": {"index": "twitter"  },  "dest": {"index": "new_twitter" }}
# 六、中文分词ES 内置了很多种分词器,但是对中文分词不友好,所以我们需要借助第三方中文分词工具包。## 6.1 ES 中的分词的原理### 6.1.1 ES 的分词器概念ES 的一个分词器 ( tokenizer ) 接收一个字符流,将其分割为独立的词元 ( tokens ) ,然后输出词元流。ES 提供了很多内置的分词器,可以用来构建自定义分词器 ( custom ananlyzers )### 6.1.2 标准分词器原理比如 stadard tokenizer 标准分词器,遇到空格进行分词。该分词器还负责记录各个词条 ( term ) 的顺序或 position 位置 ( 用于 phrase 短语和 word proximity 词近邻查询 ) 。每个单词的字符偏移量 ( 用于高亮显示搜索的内容 ) 。### 6.1.3 英文和标点符号分词示例查询示例如下:```jsonPOST _analyze{  "analyzer": "standard",  "text": "Do you know why I want to study ELK? 2 3 33..."}
查询结果:```shdo, you, know, why, i, want, to, study, elk, 2,3,33
从查询结果可以看到:(1)标点符号没有分词。(2)数字会进行分词。![英文句子分词](https://img-blog.csdnimg.cn/img_convert/be6744e495379ec24dc5702daf9a45bd.png)### 6.1.4 中文分词示例但是这种分词器对中文的分词支持不友好,会将词语分词为单独的汉字。比如下面的示例会将 ` 悟空聊架构 ` 分词为 ` 悟 `,` 空 `,` 聊 `,` 架 `,` 构 `,期望分词为 ` 悟空 `,` 聊 `,` 架构 `。```json
POST _analyze{  "analyzer": "standard",  "text": "悟空聊架构"}
![中文分词悟空聊架构](https://img-blog.csdnimg.cn/img_convert/ba65678cdd7065fe1787ee4ad6216dcf.png)我们可以安装 ik 分词器来更加友好的支持中文分词。## 6.2  安装 ik 分词器### 6.2.1 ik 分词器地址ik 分词器地址:```js

https://github.com/medcl/elasticsearch-analysis-ik/releases

先检查 ES 版本,我安装的版本是 `7.4.2`,所以我们安装 ik 分词器的版本也选择 7.4.2```json
http://192.168.56.10:9200/{  "name" : "8448ec5f3312",  "cluster_name" : "elasticsearch",  "cluster_uuid" : "xC72O3nKSjWavYZ-EPt9Gw",  "version" : {"number" : "7.4.2","build_flavor" : "default","build_type" : "docker","build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96","build_date" : "2019-10-28T20:40:44.881551Z","build_snapshot" : false,"lucene_version" : "8.2.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0-beta1"  },  "tagline" : "You Know, for Search"}
![选择 ik 分词器](https://img-blog.csdnimg.cn/img_convert/c659d667dcbf7fd51f65582629f2f22b.png)### 6.2.2 安装 ik 分词器的方式#### 6.2.2.1 方式一:容器内安装 ik 分词器-   进入 es 容器内部 plugins 目录```sh

docker exec -it <容器 id> /bin/bash

-   获取 ik 分词器压缩包```sh

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip

-   解压缩 ik 压缩包```sh

unzip 压缩包

-   删除下载的压缩包```sh

rm -rf *.zip

#### 6.2.2.2 方式二:映射文件安装 ik 分词器进入到映射文件夹```sh

cd /mydata/elasticsearch/plugins

下载安装包```sh

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip

-   解压缩 ik 压缩包```sh

unzip 压缩包

-   删除下载的压缩包```sh

rm -rf *.zip

#### 6.2.2.3 方式三:Xftp 上传压缩包到映射目录先用 XShell 工具连接虚拟机 ( 操作步骤可以参考之前写的文章 [02. 快速搭建 Linux 环境-运维必备](http://www.passjava.cn/#/01.PassJava/03.Deploy/01.环境搭建篇)) ,然后用 Xftp 将下载好的安装包复制到虚拟机。![Xftp 上传压缩包](https://img-blog.csdnimg.cn/img_convert/cf64999a4ee2ea9bc853ed793909f25d.png)## 6.3 解压 ik 分词器到容器中-   如果没有安装 unzip 解压工具,则安装 unzip 解压工具。```sh

apt install unzip

-   解压 ik 分词器到当前目录的 ik 文件夹下。命令格式:unzip 实例:```sh

unzip ELK-IKv7.4.2.zip -d ./ik

![解压 ik 分词器](https://img-blog.csdnimg.cn/img_convert/7c7d06d44f5f0f59bac69f479d5d5fcf.png)-   修改文件夹权限为可读可写。```sh

chmod -R 777 ik/

-   删除 ik 分词器压缩包```sh

rm ELK-IKv7.4.2.zip

## 6.4 检查 ik 分词器安装-   进入到容器中```sh

docker exec -it <容器 id> /bin/bash

-   查看 Elasticsearch 的插件```sh

elasticsearch-plugin list

结果如下,说明 ik 分词器安装好了。是不是很简单。```sh

ik

![ik 分词器插件](https://img-blog.csdnimg.cn/img_convert/6657e700440bf7d67ecaec68513293c4.png)然后退出 Elasticsearch 容器,并重启 Elasticsearch 容器```sh

exit

docker restart elasticsearch

## 6.5 使用 ik 中文分词器ik 分词器有两种模式-   智能分词模式 ( ik_smart )-   最大组合分词模式 ( ik_max_word )我们先看下 ` 智能分词 ` 模式的效果。比如对于 ` 一颗小星星 ` 进行中文分词,得到的两个词语:` 一颗 `、` 小星星 `我们在 Dev Tools Console 输入如下查询```json
POST _analyze{  "analyzer": "ik_smart",  "text": "一颗小星星"}
得到如下结果,被分词为 一颗和小星星。![一颗小星星分词结果](https://img-blog.csdnimg.cn/img_convert/4d9c24eeda57ed9901b6e416e3607f19.png)再来看下 ` 最大组合分词模式 `。输入如下查询语句。```json
POST _analyze{  "analyzer": "ik_max_word",  "text": "一颗小星星"}
` 一颗小星星 ` 被分成了 6 个词语:一颗、一、颗、小星星、小星、星星。![一颗小星星分词结果](https://img-blog.csdnimg.cn/img_convert/5a7c4cd0f4705f015c200f5b59a42e8b.png)我们再来看下另外一个中文分词。比如搜索悟空哥聊架构,期望结果:悟空哥、聊、架构三个词语。实际结果:悟、空哥、聊、架构四个词语。ik 分词器将悟空哥分词了,认为 ` 空哥 ` 是一个词语。所以需要让 ik 分词器知道 ` 悟空哥 ` 是一个词语,不需要拆分。那怎么办做呢?![悟空哥聊架构分词](https://img-blog.csdnimg.cn/img_convert/03569becc311d0b9cc9b7cb420740183.png) ## 6.6 自定义分词词库### 6.6.1 自定义词库的方案- 方案  新建一个词库文件,然后在 ik 分词器的配置文件中指定分词词库文件的路径。可以指定本地路径,也可以指定远程服务器文件路径。这里我们使用远程服务器文件的方案,因为这种方案可以支持热更新 ( 更新服务器文件,ik 分词词库也会重新加载 ) 。- 修改配置文件ik 分词器的配置文件在容器中的路径:```sh
/usr/share/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml。修改这个文件可以通过修改映射文件,文件路径:```sh/mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml编辑配置文件:```shvim /mydata/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml配置文件内容如下所示:```xml
IK Analyzer 扩展配置
custom/mydict.dic;custom/single_word_low_freq.dic
custom/ext_stopword.dic
location
http://xxx.com/xxx.dic

修改配置 `remote_ext_dict` 的属性值,指定一个 远程网站文件的路径,比如 http://www.xxx.com/ikwords.text。这里我们可以自己搭建一套 nginx 环境,然后把 ikwords.text 放到 nginx 根目录。### 6.6.2 搭建 nginx 环境方案:首先获取 nginx 镜像,然后启动一个 nginx 容器,然后将 nginx 的配置文件拷贝到根目录,再删除原 nginx 容器,再用映射文件夹的方式来重新启动 nginx 容器。-   通过 docker 容器安装 nginx 环境。```sh

docker run -p 80:80 --name nginx -d nginx:1.10

-   拷贝 nginx 容器的配置文件到 mydata 目录的 conf 文件夹```sh

cd /mydata

docker container cp nginx:/etc/nginx ./conf

-   mydata 目录 里面创建 nginx 目录```sh

mkdir nginx

-   移动 conf 文件夹到 nginx 映射文件夹```sh

mv conf nginx/

-   终止并删除原 nginx 容器```sh

docker stop nginx

docker rm <容器 id>

-   启动新的容器```sh

docker run -p 80:80 --name nginx \

-v /mydata/nginx/html:/usr/share/nginx/html \

-v /mydata/nginx/logs:/var/log/nginx \

-v /mydata/nginx/conf:/etc/nginx \

-d nginx:1.10

-   访问 nginx 服务```sh

192.168.56.10

报 403 Forbidden, nginx/1.10.3 则表示 nginx 服务正常启动。403 异常的原因是 nginx 服务下没有文件。-   nginx 目录新建一个 html 文件```sh

cd /mydata/nginx/html

vim index.html

hello passjava

- 再次访问 nginx 服务  浏览器打印 hello passjava。说明访问 nginx 服务的页面没有问题。- 创建 ik 分词词库文件```sh

cd /mydata/nginx/html

mkdir ik

cd ik

vim ik.txt

填写 ` 悟空哥 `,并保存文件。-   访问词库文件```sh

http://192.168.56.10/ik/ik.txt

浏览器会输出一串乱码,可以先忽略乱码问题。说明词库文件可以访问到。-   修改 ik 分词器配置```sh

cd /mydata/elasticsearch/plugins/ik/config

vim IKAnalyzer.cfg.xml

![修改 ik 分词器配置](https://img-blog.csdnimg.cn/img_convert/6c7b8b9c8f4ad02efe7aa5211ffbdbca.png)-   重启 elasticsearch 容器并设置每次重启机器后都启动 elasticsearch 容器。```sh

docker restart elasticsearch

docker update elasticsearch --restart=always

再次查询分词结果

可以看到 悟空哥聊架构被拆分为 悟空哥架构三个词语,说明自定义词库中的 悟空哥有作用。

自定义词库后的分词结果

七、写在最后

中篇和下篇继续肝,加油冲呀!

中篇: 实战 ES 应用。下篇: ES 的集群部署。

我是悟空哥,努力变强,变身超级赛亚人!我们下期见!

x 广告
最近更新

【ES三周年】2 万字长文,带你深入理解 Elasticsearch

2023-02-24

有而勿失,得而勿忘|每日播报

2023-02-23

【全球快播报】阿里Q3财报:菜鸟外部收入同比增长27% 运营海外分拨中心增至15个

2023-02-23

奇溪基金第18个奇材书屋落地新疆

2023-02-23

广西桂林:在桂海晴岚,无论从哪里拍都是一幅山水画

2023-02-23

研究将认知能力下降与骨质流失和骨折风险联系起来-全球快看点

2023-02-23

鼠年72年车牌尾号 最旺属鼠人的6个数字|世界新要闻

2023-02-23

xbox有什么双人游戏,xbox360上有什么能双人玩的游戏

2023-02-23

蒙迪欧1.5T车型值得等吗?哪些A级车空间大?_天天视讯

2023-02-23

全球快报:河南物业管理条例全文_物业管理条例全文2018

2023-02-23

环球微动态丨2022年01月16日整理发布:mysql怎么加入一个数据库

2023-02-23

中国男篮世预赛12人大名单公布 曾凡博+胡金秋落选

2023-02-22

勤上股份将于2月24日解禁1.1亿股

2023-02-22

沪纽金合约2022年2月22日参考价格表;

2023-02-22

风华高科(000636)2月22日主力资金净卖出290.21万元 环球关注

2023-02-22

陈茂波:为更好管理现金流 香港特区政府将考虑适当运用各项财务工具

2023-02-22

农村宅基地审批放开了,满足4个条件就能申请建房,看看有你没?

2023-02-22

【天天新视野】掌趣科技(300315)2月21日主力资金净卖出2797.09万元

2023-02-22

看点:杰拉德:皇马是更好的球队 卡马文加表现得非常成熟和优秀

2023-02-22

将夜第二季播出时间_将夜第二季的相关进展

2023-02-22

每日热讯!soraa 是那个品牌_Solam品牌的中文名是什么

2023-02-21

当前简讯:龙虎榜|亚通精工今日跌8.3%,上榜营业部席位全天合计净买入1403.76万元

2023-02-21

完美世界:仙古纪元柳神是九天十地第一个高手吗?

2023-02-21

19家单位57名选手参赛!山东省“技能兴鲁”黄河流域地热新能源职业技能竞赛在德州举行

2023-02-21

【全球速看料】一致魔芋在北交所上市:市值突破11亿元,吴平夫妇为实控人

2023-02-21

中国民生银行信阳永兴花园社区支行服务无止境

2023-02-21

调查|能捡大漏?隐患重重?揭开“法拍房”的神秘面纱 世界快消息

2023-02-21

天天快报!2700多份业绩预告超四成预喜 折射经济韧性

2023-02-21

武警山东总队广泛开展“六个节约”活动从一粥一饭入手杜绝“微浪费”

2023-02-21

绣球养护方法_绣球怎么养护比较好-环球热讯

2023-02-21

strike的过去式_strike过去式_环球热讯

2023-02-20

【热闻】grill什么意思中文意思_GRI的中文全称意思是什么

2023-02-20

湘赣开放合作试验区_关于湘赣开放合作试验区介绍

2023-02-20

联赛场次未定北京国安已经推出售票方案,最贵票价高达五万元 天天最资讯

2023-02-20

朱阁枕黄粱打一中国古典名著_朱阁枕黄粱打一中国小说名

2023-02-20

23长兴农商行二级资本债今日发布发行公告-世界最资讯

2023-02-20

全球观焦点:我国光固化水凝胶促角膜修复获新突破

2023-02-20

今日巫师三凯拉能干几次_巫师三凯拉 世界快报

2023-02-20

世界快报:索内斯谈萨比策蹬踏:绝对的红牌,如果这不是危险动作那什么是?

2023-02-20

石阡检察院 上门听证 解开信访人心结

2023-02-19

仅一幅妇人击鼓的画就预测出武则天将会称帝,这种说法是否靠谱?

2023-02-19

【环球报资讯】今天最新消息 上海浦东:市场主体登记确认制助力经济加快恢复重振

2023-02-19

解除王者健康系统平台绑定_解除王者健康系统平台

2023-02-19

首付4.65万,月均花费3928元,续航420km的本田e:NP1 极湃1怎么样

2023-02-19

若有来生我定还爱你_关于若有来生我定还爱你的简介

2023-02-19

最适合打工族的德系SUV,外观霸气,你值得拥有!

2023-02-19

郑伊健怎么没消息了 郑伊健为什么被封杀_世界快看

2023-02-18

高须泰子的职业_高须泰子

2023-02-18

心态好的人,往往有这6个习惯

2023-02-18

天天看点:谈判结束 中国与厄瓜多尔将争取尽早正式签署自贸协定

2023-02-18

中央气象台:华北、汾渭平原等地有霾-时讯

2023-02-18

八廓街升腾烟火气-微动态

2023-02-18

白鬼院凛凛蝶 当前看点

2023-02-18

当前短讯!集装箱供大于求,船舶运力过剩,今年旺季何时来?

2023-02-17

【黑色梦中】第二十六梦-我仍还在烈阳下-天天即时看

2023-02-17

世界速讯:家长怎么跟熊孩子打交道?就记住一点:赏识

2023-02-17

【世界新视野】安徽有哪些大学排名_安徽有哪些大学

2023-02-17

杭州萧山金梧桐应届生第二次生活补贴申请(条件+材料+流程)|焦点热闻

2023-02-17

如何制作骆驼祥子思维导图_如何制作骆驼祥子思维导图手抄报 天天热资讯

2023-02-17

网传杭州3月1号取消限行? 假的!是ChatGPT写的!警方已介入调查

2023-02-17

更多支持政策将出 2023年光伏新增装机或超95GW 全球动态

2023-02-17

微信小程序制作流程图_几款免费流程图制作软件 热资讯

2023-02-17

总投资1447.3亿元!石家庄市538个重点项目集中开工

2023-02-17

李志飞回媒体“出门问硬件和ToB业务”表现不错,将做中国OpenAI

2023-02-16

环球快播:酷我音乐盒下载安装电脑版_酷我音乐盒安装

2023-02-16

想象作文三年级300字下册_奇妙的想象三年级作文 每日速看

2023-02-16

Java开发工具IntelliJ IDEA 2020.2完整授权流程

2023-02-16

c盘越来越小win10_c盘越来越小

2023-02-16

宁夏闽宁镇:智慧农业赋能乡村振兴

2023-02-16

全球微速讯:2023黑龙江牡丹江六县高三联考答案及试卷全科汇总_更新中

2023-02-16

白腊金命是什么意思

2023-02-16

兵团教育信息网登录_环球焦点

2023-02-16

2022年虎年不宜生子的属相 两者相冲有不吉 世界简讯

2023-02-16

我的世界破碎第二季大结局_我的世界破碎第二季

2023-02-16

梦见黑蝴蝶是什么意思 梦见黑蝴蝶有什么预兆

2023-02-16

房贷多久能放款下来

2023-02-15

excel的trim函数如何使用_trim函数的使用方法|焦点短讯

2023-02-15

山东省医师协会第十二次专科医师分会/专业委员会主任委员会议在济南召开 天天微速讯

2023-02-15

【播资讯】立夏是公历什么时候 立夏是公历的时间

2023-02-15

中伟股份:公司2022年规划的磷酸铁一期工程年产能为20万吨 主要客户为主流正极厂商及电池企业|世界时讯

2023-02-15

防暑小妙招_夏天如何防暑

2023-02-15

空调制热不热是什么原因

2023-02-15

2023年全国各省市职工平均工资一览、2023年全国社保基数标准是多少

2023-02-15

厦门国贸拟发行15亿元公司债,用于偿还公司债券本金-天天新动态

2023-02-15

“第四届非遗相声大会”抖音开播,观看人数超1300万

2023-02-15

部门用英语怎么说_今日讯

2023-02-15

最资讯丨摩托罗拉 Moto G Stylus 2023 全新渲染图流出,支持手写笔

2023-02-15

大消费萎靡,化工、有色等顺周期发力,化工ETF尾盘猛烈放量成交激增5倍,此前连续3日获资金加持!

2023-02-15

【全球时快讯】季度工作总结报告万能5篇

2023-02-15

两年的车年检需不需要处理违章

2023-02-15

描写景物作文500字5篇

2023-02-15

女儿 18 岁生日的礼物创意

2023-02-15

今日看点:精选4篇部队个人年终工作总结

2023-02-15

连续第七个月降温!美国1月CPI同比上升6.4%,服务通胀升刷新40多年来最高

2023-02-14

英语听力经典训练方法_每日信息

2023-02-14

酷特智能3名股东减持222.66万股 套现约2685.28万 22年前三季度公司净利6084.47万 环球聚看点

2023-02-14

“浪漫经济”提振花卉产业 昆明斗南鲜切花供不应求 环球滚动

2023-02-14

简洁美观的元旦手抄报图片

2023-02-14

唯科科技(301196)2月14日主力资金净卖出31.51万元-讯息

2023-02-14

刀剑制作官网在哪下载 最新官方下载安装地址

2023-02-14

全球今日讯!鹰的铅笔画图片

2023-02-14

2023沧州奥特曼系列舞台剧演出时间+地点+票价_全球聚焦

2023-02-14

黄河旋风2月14日盘中涨幅达5%

2023-02-14

摩洛哥胡塞马省发生4.3级地震

2023-02-14

嘉里建设(ADR)(KRYPY.US)2月13日收盘报12.85美元/股

2023-02-14

rand是什么意思_rand的用法|短讯

2023-02-14

双酚a是什么 焦点

2023-02-14

什么样的礼物|天天快资讯

2023-02-14

天天速读:内蒙古呼和浩特现有高风险区452个,中风险区125个

2023-02-13

上古六大神兽-快资讯

2023-02-13

天天即时看!广州公积金哪些提取条件不能在移动端操作申请?

2023-02-13

精彩看点:教师节送女老师礼物

2023-02-13

一月婴儿吃奶蹬腿打挺哭闹_婴儿吃奶蹬腿打挺哭闹什么原因_环球热门

2023-02-13

海程邦达董秘回复:公司在推进数字化运营方面的主要举措体现在新一代统一运营平台BONDEXONE的研发与应用上 全球快消息

2023-02-13

世界讯息:中金:金价有望突破2500美元?黄金价格这是又要大涨了?

2023-02-13

佝偻病的早期症状图片鸡胸_佝偻病的早期症状图片|快看点

2023-02-13

环球快讯:制造业高质量发展指数全国首位!江苏2022规上工业增加值增长5.1%

2023-02-13

全球微动态丨西峡县:兰香似清风 宣讲正当时

2023-02-12

“春风”送岗稳就业

2023-02-12

全球动态:人力资源禀赋是什么意思_资源禀赋是什么意思

2023-02-12

本赛季至今仅两人达成50+盖帽100+三分:PJ-华盛顿和大洛 环球焦点

2023-02-12

告别大雁这个故事的梗概_告别大雁故事梗概50字

2023-02-11

环球快资讯:中秋给女的送月饼为啥

2023-02-11

世界资讯:老婆出产房拿什么礼物最好

2023-02-11

新疆明确社会资本参与生态保护修复范围

2023-02-11

快看点丨鲍里斯一世:从可汗到大公;从异教到东正教——保加利亚简史10

2023-02-11

当前视讯!美国评出世界最耐用的20款汽车,中国品牌0入围,丰田10款上榜

2023-02-11

书桌简笔画儿童_书桌简笔画

2023-02-11

大力水手的女朋友叫什么英文名 天天看热讯

2023-02-11

环球讯息:秦刚同比利时外交大臣拉比卜通电话

2023-02-11

全运会足球_关于全运会足球的介绍-当前要闻

2023-02-10

今日精选:聊聊这张卡梅隆安东尼PSA9分评级卡

2023-02-10

世界女排联赛赛程公布,中国女排5月31日首战巴西

2023-02-10

企业软文范例怎么写-世界快看点

2023-02-10

02月10日15时江西南昌疫情数据 阳了以后为什么会腰疼?应该怎么办? 全球动态

2023-02-10

热资讯!众多美媒极少提及“北溪”管道调查报道 外交部回应

2023-02-10

环球即时:红米k20pro怎么分屏

2023-02-10

最新快讯!容志行上榜(被称为中国贝利) 中国足球最强十大前锋

2023-02-10

四川10月2日新增外省返川新冠感染者46例,新增省内感染者32例

2023-02-10

上海海港俱乐部召开媒体通气会对于球队近期的备战情况进行了介绍

2023-02-10

怎么测试麦克风是否正常

2023-02-10

中经评论:莫让朋友圈“信用修复”蒙蔽双眼

2023-02-10

多张照片拼成一张人脸的软件_多张照片拼成一张人脸

2023-02-10

全球视讯!十大热门新款羽绒服排行榜_时尚新款羽绒服推荐

2023-02-10

天天快播:12月30日动漫生日礼物

2023-02-10

地下城空白名字怎么打_世界聚焦

2023-02-10

世界速递!标配L2级驾驶辅助,不愧是吉利压箱底之作,采用光波涟漪前中网

2023-02-09

金新月是哪三个国家_金新月是哪三个国家

2023-02-09

弘扬国粹传承 株洲师专学子专场献唱经典戏曲剧目

2023-02-09

这位外卖小哥,找到了!

2023-02-09

闰四月出生几年过一次生日,闰四月留娘糕是什么意思?|焦点速讯

2023-02-09

紫金县政府人民政府门户网站_紫金政府网-热闻

2023-02-09

Tap Saga Education实施高影响力辅导计划

2023-02-09

世界时讯:使命召唤8攻略 使命召唤8攻略介绍

2023-02-09

男职工生育保险怎么使用 有这几种使用方式

2023-02-09

西藏药业:对于公司投资建设的腺病毒疫苗生产线,公司一直都在积极寻求多方合作,目前暂无合适的合作方

2023-02-09

速递!杭州有哪些好玩的地方 在杭州哪里好玩

2023-02-09

镇宁高荡村:民族风情重绽 乡村旅游升温-今日观点

2023-02-09

NBA常规赛前瞻:步行者VS热火_谁能止住连败 重返胜轨?

2023-02-09

中国第一富豪村 现在中国最有钱最富的村子 全球快资讯

2023-02-09

环球即时:莹云石官网下载_莹云石官网

2023-02-09

环球新资讯:2020录取结果什么时候出

2023-02-09

2月8日基金净值:建信中证500指数增强A最新净值2.8319,跌0.52% 最新快讯

2023-02-09

华夏基金莫一帆:公募REITs资产类型呈现多样化发展趋势-世界最资讯

2023-02-08

每日关注!周公解梦梦见河流有哪些含义

2023-02-08

中国企业积极参与德国纽伦堡玩具博览会 今日关注

2023-02-08

enhancer-当前关注

2023-02-08

天天热头条丨用英文给圣诞老人写信

2023-02-08

长城汽车1月销量61519辆,子品牌均表现低迷,海外出口挽回点颜面

2023-02-08

23岁以下禁止进动态场所_23岁以下禁止进动态

2023-02-08

世界速看:乡村振兴|革命老区延安:春来勤耕耘 棚棚“聚宝盆”

2023-02-08

世界热推荐:描写夏至的古诗最新10篇

2023-02-08

朱砂红砂和紫金砂的区别_紫金砂和朱砂区别 每日报道

2023-02-08

Canalys:2022年印度电动汽车市场增长223% 销量达4.8万辆

2023-02-08

最新资讯:全职英语翻译

2023-02-08

环球微动态丨ique

2023-02-08

八马茶业三战IPO毛利率56%净利率仅10% 王文彬家族控股63%“姻亲圈”身家867亿

2023-02-08

兔子的故事小学生作文

2023-02-08

存款利率下调,储户们怎么看?

2023-02-08

2月7日基金净值:易方达磐泰一年持有期混合A最新净值1.0952,涨0.08%

2023-02-08

汽车票查询12306官网_汽车票 查询

2023-02-08

广州越秀区住房租赁补贴公示在哪里查? 天天新视野

2023-02-07

自由组合发生在什么时期

2023-02-07

11_关于11的介绍

2023-02-07

环球热推荐:真我推出V30/V30t新机,售价1099元起

2023-02-07

每日热议!宝刀未老!外媒透露郎平或执教土豪豪门,有望联手李盈莹争夺冠军

2023-02-07

别人把我拉黑了怎么解开_别人把我拉黑了怎么恢复

2023-02-07

做鬼脸用英语怎么说_天天速读

2023-02-07

天天新消息丨流泪的新娘剧情介绍_电视剧流泪的新娘简介

2023-02-07

afraid怎么读 发音_afraid怎么读音

2023-02-07

思念一个荒废的名字钢琴谱_思念一个荒废的名字 歌词

2023-02-07

马特塔格特_马辛 戈塔特 当前观点

2023-02-07

(新春走基层)山东多彩非遗民俗“花式”闹元宵|当前通讯

2023-02-07

世界看热讯:钒电池板块2月6日跌1.31%,西子洁能领跌,主力资金净流出3.5亿元

2023-02-07

财信金控与湘潭市举办交流座谈会 共同打响“发展六仗”-世界报资讯

2023-02-07

世界观天下!写给自己的霸气一段话_这些话推荐给你

2023-02-06

【环球速看料】动视暴雪被罚3500万美元

2023-02-06

上海丰军洗涤设备有限公司|焦点短讯

2023-02-06

黑龙江省率先建立“黑土地肥沃耕层构建”地方标准体系 全球速讯

2023-02-06

A股盘绿震荡:沪指日线3连阴 ChatGPT概念再活跃-天天播报

2023-02-06