Elasticsearch的基础知识

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 }
View Code

说明:_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 }
View Code

注意:有这几个字段的内容发生了变化

"_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 }
View Code

说明:_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 }
View Code

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 }
View Code

上面的搜索是搜索整个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

 

原文地址:https://www.cnblogs.com/hld123/p/13278049.html