Elasticsearch的基础知识
一、概述
Elasticsearch(下面简称ES)是一个基于Lucene(一个开源全文搜索引擎)构建的开源、分布式可扩展的实时搜索和分析引擎。作为目前最流行的开源搜索引擎,Elasticsearch 在同领域几乎没有竞争对手。维基百科、Stack Overflow、Github 等系统都采用它。
在 GitHub 上搜索时,ES 可实现代码级搜索与高亮显示;在网上购物时,它会为用户推荐喜欢的商品;下班打车回家时,它可以定位附近的乘客和司机,帮平台优化调度。
此外,Elasticsearch 还被广泛运用于大数据近实时分析,包括日志分析、指标监控、信息安全等多个领域。它不仅可以探索海量结构化、非结构化数据,按需创建可视化报表,对监控数据设置报警阈值,还能通过使用机器学习,自动识别异常状况。
上手 Elasticsearch 也很容易,花几分钟设置好开发环境,就能在成百上千台服务器上实现 PB 级的数据处理了。Elasticsearch 把操作都封装成了 HTTP 的 API,我们只要给 Elasticsearch 发送 HTTP 请求就行。
二、基础知识
1、反向索引
反向索引又叫倒排索引,是根据文章内容中的关键字建立索引。搜索引擎的原理就是建立反向索引。
2、索引(Index)、类型(Type)、文档(Document)
1)ES中的索引是存放数据的地方,可以理解为mysql中的一个数据库
2)类型是用来定义数据结构的,可以认为是mysql中的一张表。类型是通过 Mapping 来定义每个字段的类型。
3)文档就是最终的数据,可以认为一个文档就是一条记录。文档以json形式描述一行数据。
3、Elasticsearch分布式原理
Elasticsearch 会对数据进行切分,同时每一个分片会保存多个副本,其原因和 HDFS 是一样的,都是为了保证分布式环境下的高可用。
4、数据类型
1)查询给定时间段的数据:date
2)查询给定区间范围的数值类型数据:integer、long
3)查询给定区间范围的字符串类型数据:keyword、text
keyword和text的区别:Keyword 类型是不会分词的,直接根据字符串内容建立反向索引,text 类型在存入 Elasticsearch 的时候,会先分词,然后根据分词后的内容建立反向索引。
5、通过RESTful API来使用ES
1)增
1 PUT /blogs/blog/1 2 3 { 4 5 "title": "es info", 6 7 "content": "about es", 8 9 "author": "jack", 10 11 "year":2018 12 13 }
请求成功后返回:
1 { 2 3 "_index": "blogs", 4 5 "_type": "blog", 6 7 "_id": "1", 8 9 "_version": 1, 10 11 "result": "created", 12 13 "_shards": { 14 15 "total": 2, 16 17 "successful": 1, 18 19 "failed": 0 20 21 }, 22 23 "created": true 24 25 }
说明:_id是主键ID,这个主键ID是唯一的,可以在插入数据时指定ID,也可以由ES系统自动生成。
不过自动生成,HTTP的操作需要使用POST而不是PUT。系统自动生成的_id对应的值是唯一的随机字符串。
2)改
PUT /blogs/blog/1
请求成功后返回:
1 { 2 3 "_index": "blogs", 4 5 "_type": "blog", 6 7 "_id": "1", 8 9 "_version": 2, 10 11 "result": "updated", 12 13 "_shards": { 14 15 "total": 1, 16 17 "successful": 1, 18 19 "failed": 0 20 21 }, 22 23 "_seq_no": 2, 24 25 "_primary_term": 7 26 27 }
注意:有这几个字段的内容发生了变化
"_version" : 2,
"result" : "updated",
"created" : false
3)查
GET /blogs/blog/1
请求成功后返回:
1 { 2 3 "_index": "blogs", 4 5 "_type": "blog", 6 7 "_id": "1", 8 9 "_version": 2, 10 11 "found": true, 12 13 "_source": { 14 15 "title": "es info", 16 17 "content": "about es", 18 19 "author": "tom", 20 21 "year": 2020 22 23 } 24 25 }
说明:_version是ES文档的版本号
作用:我们在修改数据时,可以传入一个版本号。这样当在一个客户端读取和更新文档的间隔中,有另外客户端更新了数据。如果这个客户端的更新操作传入了版本号(前面读取的版本号),这时因为传入的版本号和当期实际的版本号不一致,就会操作失败。这样就防止可能的数据冲突。这也是ES采用乐观并发控制(OCC)机制的体现。
乐观并发控制:乐观并发是一个应用于事务系统(关系型数据库管理系统与软件内存事务)的并发控制方法。
OCC通常用于低数据争夺的环境下。当冲突较少时,事务的完成将会没有管理锁的消耗,并且不需要令事务等待其他的事务锁释放,其结果导致比其他的并发控制方法有着更高的吞吐量。
加入版本号进行更新,只需在url后面加上version参数,如:
PUT /blogs/blog/1?version=2
4)删
通过DELETE操作,可以删除ES中的数据
DELETE /blogs/blog/1
请求成功后返回:
1 { 2 3 "_index": "blogs", 4 5 "_type": "blog", 6 7 "_id": "1", 8 9 "_version": 4, 10 11 "result": "deleted", 12 13 "_shards": { 14 15 "total": 1, 16 17 "successful": 1, 18 19 "failed": 0 20 21 }, 22 23 "_seq_no": 3, 24 25 "_primary_term": 7 26 27 }
5)搜索
1 POST /_search 2 { 3 "query": { 4 "query_string": { 5 "query": "zk" 6 } 7 } 8 }
请求成功后返回:
1 { 2 3 "took": 46, 4 5 "timed_out": false, 6 7 "_shards": { 8 9 "total": 35, 10 11 "successful": 35, 12 13 "skipped": 0, 14 15 "failed": 0 16 17 }, 18 19 "hits": { 20 21 "total": 1, 22 23 "max_score": 0.2876821, 24 25 "hits": [ 26 27 { 28 29 "_index": "blogs", 30 31 "_type": "blog", 32 33 "_id": "2", 34 35 "_score": 0.2876821, 36 37 "_source": { 38 39 "title": "zk info", 40 41 "content": "about zk", 42 43 "author": "jack", 44 45 "year": 2018 46 47 } 48 49 } 50 51 ] 52 53 } 54 55 }
上面的搜索是搜索整个json数据中的信息,我们也可以只搜索指定json字段中的内容。如:
POST /_search { "query": { "query_string": { "query": "jack", "fields": ["author"] } } }
6、典型应用
1)用 Elasticsearch 搭建 ELK 系统,也就是日志分析系统。其中包括Elasticsearch、 Logstash(日志收集系统)、Kibana(数据可视化平台)。
2)ELKB也被广泛应用,Beats是ELK 协议栈的新成员,一个轻量级开源数据搜集器架构,基于 Logstash-Forwarder 源代码开发,是对它的替代。beats 就能读取数据,迅速发送到 Logstash 进行解析,亦或直接发送到 Elasticsearch 进行集中式存储和分析。Beats目前有开发了很多版本的数据采集器。
参考链接:https://www.jianshu.com/p/099e27d6cd91