• ElasticSearch


    简介

       ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,

      是一种流行的企业级搜索引擎。

    下载安装

      ElasticSearch 下载:https://www.elastic.co/cn/downloads/elasticsearch

      kibana 下载:https://www.elastic.co/cn/downloads/kibana

      windows安装很简单,解压启动就行了。一些配置可百度查询用途,刚开始学习,默认不需要修改什么。 安装后 先启动Elasticsearch,再启动kibana。这里只是简单介绍常用的语法。

    ElasticSearch

      ElasticSearch 简单的来说,你可以看成它是一个数据库。

    ES主要解决问题:

    1)检索相关数据; 
    2)返回统计结果; 
    3)速度要快。

    ES核心概念:

    1)Cluster:集群。

    ES可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

    2)Node:节点。

    形成集群的每个服务器称为节点。

    3)Shard:分片。

    当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。 
    当你查询的索引分布在多个分片上时,ES会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。

    4)Replia:副本。

    为提高查询吞吐量或实现高可用性,可以使用分片副本。 
    副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。 
    当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。

    5)全文检索。

    全文检索就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。 
    全文索引就是把内容根据词的意义进行分词,然后分别创建索引,例如”你们的激情是因为什么事情来的” 可能会被分词成:“你们“,”激情“,“什么事情“,”来“ 等token,这样当你搜索“你们” 或者 “激情” 都会把这句搜出来。

    ES数据架构的主要概念(与关系型数据库mysql相比)

      

    (1)关系型数据库中的数据库(DataBase),等价于ES中的索引(Index) 

    (2)一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type)

    (3)一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。 

    (4)在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。

       与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。 

    (5)在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET.

    ELK是什么?

      ELK=elasticsearch+Logstash+kibana 
      elasticsearch:后台分布式存储以及全文检索 
      logstash: 日志加工、“搬运工” 
      kibana:数据可视化展示。 
      ELK架构为数据分布式存储、可视化查询和日志解析创建了一个功能强大的管理链。 三者相互配合,取长补短,共同完成分布式大数据处理工作。

    Elasticsearch常用术语

    Document:文档数据,具体意义就是存储于elasticsearch中的一条数据

    Index:索引,具体意义可以理解成mysql中的一个数据库

    Type:索引中的数据类型。可以理解成一个表

    Field:字段,文档的属性,理解为表中的字段

    ElasticSearch API

    文档

      它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。简单说,它就是一个json对象,存放着数据,这个就叫文档,且具有唯一性。

    文档元数据

      一个文档不仅仅包含它的数据 ,也包含 元数据 —— 有关 文档的信息。 三个必须的元数据元素如下:

      _index文档在哪存放(索引)

    一个 索引 应该是因共同的特性被分组到一起的文档集合。 例如,你可能存储所有的产品在索引 products 中,而存储所有销售的交易到索引 sales 中。

    名字必须小写,不能以下划线开头,不能包含逗号。

      _type文档表示的对象类别(类型)

    数据可能在索引中只是松散的组合在一起,但是通常明确定义一些数据中的子分区是很有用的。 例如,所有的产品都放在一个索引中,但是你有许多不同的产品类别,比如 "electronics" 、 "kitchen" 和 "lawn-care"。

    这些文档共享一种相同的(或非常相似)的模式:他们有一个标题、描述、产品代码和价格。他们只是正好属于“产品”下的一些子类。

    可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号, 并且长度限制为256个字符. 

      _id文档唯一标识(身份证号)

    ID 是一个字符串,当它和 _index 以及 _type 组合就可以唯一确定 Elasticsearch 中的一个文档。 当你创建一个新的文档,要么提供自己的 _id ,要么让 Elasticsearch 帮你生成。


    访问:http://localhost:5601/  访问kibana

    索引篇

    查看所有索引

    命令行:curl -X GET”localhost:9200/_cat/indices?v”

    Kibana: GET  /_cat/indices?v

    创建一个索引

    命令行:curl -X PUT”localhost:9200/student?pretty”

    Kibana: PUT /student

    删除一个索引

    命令行:curl -X DELETE”localhost:9200/student?pretty”

    Kibana DELETE /student

    检查索引是否存在

    命令行: curl -i -XHEAD http://localhost:9200/student
    Kibana: HEAD/student(查看student文档是否存在) || HEAD /student/class1/3(查看ID为3的具体数据是否存在)

     文档篇

    查看所有文档数据

    KibanaPOST /_search || POST /goods/_search || POST /goods/good/_search       POST只可范围性查找,在指定索引index或指定类型type,但不能指定一个文档ID查找。

        GET /_search || GET /goods/_search || GET /goods/good/_search       GET没有此限制,它就是用于指定查找,当然范围也可以。

    创建文档 关键词_create 可加可不加

    命令行:curl -X PUT”localhost:9200/student/class1/1” -d’        //注意单引号’  还有最后}后面的单引号

    {

       "name":"汤姆",

       "age":"23",

       "favorite":"basketball"

    }

    kibana:

    PUT /goods/good/1/_create
    {
      "name":"iPhone XS Max",
      "price":"8999",
      "color":["黑色","红色","金色","银色","白色"],
      "describe":"Apple iPhone XS Max (A2104) 64GB 金色 移动联通电信4G手机 双卡双待"
    }

    POST /goods/good/2
    {
      "name":"iPhone 11 Pro Max",
      "price":"9599",
      "color":["暗夜绿色","深空灰色","金色","银色"],
      "describe":"Apple iPhone 11 Pro Max (A2220) 64GB 金色 移动联通电信4G手机 双卡双待"
    }

    POST和PUT的区别

    查询文档

    查看具体的一个文档

      命令行:curl -X GET “localhost:9200/goods/good/1?pretty”

      kibana:GET /goods/good/1

    删除文档

    命令行:curl -XDELETE ‘localhost:9200/goods/good/1’  

    kibana:DELETE  /student/class1/1    指定ID文档删除

        DELETE /student || DELETE /student/class1  范围删除

    更新文档之整体更新 和添加没差别,只是将信息替换

    curl -X PUT”localhost:9200/goods/good/1?pretty” -H ’Content-Type:application/json’ -d’ 

    {

       "name":"汤姆",

       "age":"23",

       "favorite":"basketball"

    }’

    PUT /goods/good/1   
    {
      "name":"iPhone XS Max",
      "price":"8999",
      "color":["黑色","红色","金色","银色","白色"]
    }

    更新文档之部分更新 关键字_update  将指定的文档中部分字段更新,不会影响其他字段

    curl -X POST ”localhost:9200/goods/good/1/_update?pretty” -H ’Content-Type:application/json’ -d’ 

    {

    "doc":{

        "describe":"Apple iPhone 11 Pro Max (A2220) 64GB 金色 移动联通电信4G手机 双卡双待"

      }

    }’

    POST /goods/good/1/_update
    {
      "doc":{
        "describe":"Apple iPhone 11 Pro Max (A2220) 64GB 金色 移动联通电信4G手机 双卡双待"
      }
    }


     查询篇

     空查询

    GET /_search || GET /goods/_search   可指定索引或类型查询,不知道查询所有文档
    {
       "hits" : {
          "total" :       14,
          "hits" : [
            {
              "_index":   "us",
              "_type":    "tweet",
              "_id":      "7",
              "_score":   1,
              "_source": {
                 "date":    "2014-09-17",
                 "name":    "John Smith",
                 "tweet":   "The Query DSL is really powerful and flexible",
                 "user_id": 2
              }
           },
            ... 9 RESULTS REMOVED ...
          ],
          "max_score" :   1
       },
       "took" :           4,
       "_shards" : {
          "failed" :      0,
          "successful" :  10,
          "total" :       10
       },
       "timed_out" :      false
    }

    hits

    返回结果中最重要的部分是 hits ,它包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。

    在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。这不像其他的搜索引擎,仅仅返回文档的ID,需要你单独去获取文档。

    每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。在这个例子中,我们没有指定任何查询,故所有的文档具有相同的相关性,因此对所有的结果而言 1 是中性的 _score 。

    max_score 值是与查询所匹配文档的 _score 的最大值

    took

    took 值告诉我们执行整个搜索请求耗费了多少毫秒。

    shards

    _shards 部分告诉我们在查询中参与分片的总数,以及这些分片成功了多少个失败了多少个。正常情况下我们不希望分片失败,但是分片失败是可能发生的。如果我们遭遇到一种灾难级别的故障,在这个故障中丢失了相同分片的原始数据和副本,那么对这个分片将没有可用副本来对搜索请求作出响应。假若这样,Elasticsearch 将报告这个分片是失败的,但是会继续返回剩余分片的结果。

    timeout

    timed_out 值告诉我们查询是否超时。默认情况下,搜索请求不会超时。如果低响应时间比完成结果更重要,你可以指定 timeout 为 10 或者 10ms(10毫秒),或者 1s(1秒):

    GET /_search?timeout=10ms

    在请求超时之前,Elasticsearch 将会返回已经成功从每个分片获取的结果。

     多类型,多索引

     /_search:在所有的索引中搜索所有的类型

    /gb/_search:在 gb 索引中搜索所有的类型

    /gb,us/_search:在 gb 和 us 索引中搜索所有的文档

    /g*,u*/_search:在任何以 g 或者 u 开头的索引中搜索所有的类型

    /gb/user/_search:在 gb 索引中搜索 user 类型

    /gb,us/user,tweet/_search:在 gb 和 us 索引中搜索 user 和 tweet 类型

    /_all/user,tweet/_search:在所有的索引中搜索 user 和 tweet 类型

     轻量搜索

    有两种形式的 搜索 API:一种是 轻量的” 查询字符串 版本,要求在查询字符串中传递所有的参数

                 另一种是更完整的 请求体 版本,要求使用 JSON 格式和更丰富的查询表达式作为搜索语言。

    轻量

    GET /goods/_search?q=iphone    //任何字段中,只要包含iPhone,就匹配到。(注意查询的内容 是单独的,不能与其他内容相连。如:iPhone8匹配不到,iPhone   8匹配的到。 前后无内容相连)

    复杂的查询

    +name:(yuan zhang)  + age:>35  + (male) 多个条件是或的关系
    q=male  等同于 q=+(male)
    

    多条件如下

    • name 字段中包含 mary 或者 john
    • date 值大于 2014-09-10
    • _all 字段包含 aggregations 或者 geo
    GET /goods/_search?+name:(mary john) +date:>2014-09-10 +(aggregations geo)
    更多:GET /goods/_search?q=+name:(IPhone Max Mac) +color:黑色 -price:>90000

    批量操作 关键词_bulk

    格式

    {action{metadata}}

    {request body}

    {action{metadata}}

    {request body}

    action 必须是以下选项之一

      create如果文档不存在,那么就创建它。

      index创建一个新文档或者换一个现有文档。

      update 部分更新一个文档

      delete 删除一个文档

    Metadata 指定被索引、创建、更新或者删除的文档的_index_type_id

    request body 一般除了delete命令没有body,其他都有

     POST  /_bulk

    { "delete": { "_index": "goods", "_type": "good", "_id": "3" }}

    { "create": { "_index": "goods", "_type": "good", "_id": "1" }}

    { "name": "iPhone" }

    { "index": { "_index": "goods", "_type": "good" }}

    { "name": "iPhone XS", "price" : 8000}

    { "update": { "_index": "goods", "_type": "good", "_id": "10"} }

    { "doc" : {"price" : 8900} }

     

    curl -X POST ”localhost:9200/_bulk?pretty” -H ’Content-Type:application/json’ -d’

    { "delete": { "_index": "student", "_type": "class1", "_id": "3" }}

    { "create": { "_index": "student", "_type": "class1", "_id": "101" }}

    { "name": "xiaozhao" }

    { "index": { "_index": "student", "_type": "class1" }}

    { "name": "xiaoqiang", "age" : 15 }

    { "update": { "_index": "student", "_type": "class1", "_id": "10"} }

    { "doc" : {"age" : 32} }’

     

    //可省略_index _type _id 按需添加

    curl -X POST ”localhost:9200/_bulk?pretty” -H ’Content-Type:application/json’ -d’

    { "delete": { "_id": "2" }}

    { "create": { "_id": "200" }}

    { "name": "xiaozhang" }’

     

    POST  /goods/good/_bulk

    { "delete": { "_id": "2" }}

    { "create": { "_id": "200" }}

    { "name": "xiaozhang" }

    更多内容请看官方文档

    更多内容请看官方文档

    更多内容请看官方文档

  • 相关阅读:
    内网穿透教程
    深入浅出 TCP/IP 协议栈
    STM32CUBEMX配置RTC闹钟
    RT-Thread STM32 系列 BSP 制作教程
    RT-Thread 在stm小内存系列产品的nano+msh完整移植教程
    C语言字符串与数字相互转换
    SD卡 TF卡 接口引脚定义
    定位数据格式
    安信可ESP-12F连接阿里云教程
    电脑使用网络调试助手连接阿里云步骤
  • 原文地址:https://www.cnblogs.com/FondWang/p/12001410.html
Copyright © 2020-2023  润新知