zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    OAuth2 协议原理简析及Azure AD OAuth2示例
    MySQL Innodb MVCC(多版本并发控制)
    乐观锁和悲观锁
    数据库索引
    SQL盲注
    JAVA array to list and list to array
    缓存穿透,缓存雪崩和缓存击穿
    四、Spring Cloud 之旅 -- Ribbon 负载均衡
    JavaScript中 require、import 有什么区别?
    vue 2.x Vue 3.x 日常采坑之 设置alias别名、background引入图片、全局引入scss文件 的问题
  • 原文地址:https://www.cnblogs.com/hld123/p/13278049.html
Copyright © 2011-2022 走看看