01-ElasticSearch

Elasticsearch

ES与关系型数据库的对比

  • image-20210519174933848

  • 7.x版本中type的概念已经被删除了

优点

  • 面向开发者友好,屏蔽了Lucene的复杂特性,集群自动发现(cluster discovery)
  • 自动维护数据在多个节点上的建立
  • 会帮我做搜索请求的负载均衡
  • 自动维护冗余副本,保证了部分节点宕机的情况下仍然不会有任何数据丢失
  • ES基于Lucene提供了很多高级功能:复合查询、聚合分析、基于地理位置等。
  • 对于大公司,可以构建几百台服务器的大型分布式集群,处理PB级别数据;对于小公司,开箱即用,门槛低上手简单。
  • 相比传统数据库,提供了全文检索,同义词处理(美丽的cls>漂亮的cls),相关度排名。聚合分析以及海量数据的近实时(NTR)处理,这些传统数据库完全做不到。

基本概念

  • ES节点
    • Master节点 主节点
      • 每个集群只有一个master节点,尽量避免将maser节点作为数据节点
    • voting节点 投票节点
      • 仅仅为投票节点,即使设置为data.master为true,也不会参选,但是可以作为数据节点
    • coordinating 协调节点
      • 每一个节点都是隐式的协调节点,如果同时设置了data.master = false和data.data=false,那么此节点将成为仅协调节点。
    • data 节点 数据节点
    • Master-eligible node 候选节点

node.master和node.data

  • node.master = true node.data = true
    • 这是ES节点默认配置,既作为候选节点又作为数据节点,这样的节点一旦被选举为Master,压力是比较大的,通常来说Master节点应该只承担较为轻量级的任务,比如创建删除索引,分片均衡等。
  • node.master = true node.data = false
  • 只作为候选节点,不作为数据节点,可参选Master节点,当选后成为真正的Master节点。
  • node.master=false node.data=true
  • 不作为候选节点,但是作为数据节点,这样的节点主要负责数据存储和查询服务
  • node.master = false node.data = false
    • 既不当候选节点,也不作为数据节点,那就是仅协调节点,负责负载均衡

基本操作

集群健康值

  • 健康值检查
    • _cat/health
    • _cluster/health
  • 健康值状态
    • 绿色:所有Primary和Replica均为active,集群健康
    • 黄色:至少一个Replica不可用,但是所有Primary均为active,数据仍然是可以保证完整性的。
    • 红色:至少有一个Primary为不可用状态,数据不完整,集群不可用。

索引基本操作

  • 查看单个索引

    • http://127.0.0.1:9200/shopping
    • get请求/删除是post请求
    • 返回信息
      • {
            "shopping"【索引名】 : {
                "aliases"【别名】 : {},
                "mappings"【映射】 : {},
                "settings"【设置】 : {
                    "index"【设置 - 索引】 : {
                        "creation_date"【设置 - 索引 - 创建时间】 : "1614265373911",
                        "number_of_shards"【设置 - 索引 - 主分片数量】 : "1",
                        "number_of_replicas"【设置 - 索引 - 副分片数量】 : "1",
                        "uuid"【设置 - 索引 - 唯一标识】 : "eI5wemRERTumxGCc1bAk2A",
                        "version"【设置 - 索引 - 版本】 : {
                            "created": "7080099"
                        },
                        "provided_name"【设置 - 索引 - 名称】 : "shopping"
                    }
                }
            }
        }  
        
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
              
        + 查看所有索引信息
        + http://127.0.0.1:9200/_cat/indices?v
        + get请求
        + 返回结果
        + | 表头 | 含义 |
        | -------------- | ------------------------------------------------------------ |
        | health | 当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整) red(单点不正常) |
        | status | 索引打开、关闭状态 |
        | index | 索引名 |
        | uuid | 索引统一编号 |
        | pri | 主分片数量 |
        | rep | 副本数量 |
        | docs.count | 可用文档数量 |
        | docs.deleted | 文档删除状态(逻辑删除) |
        | store.size | 主分片和副分片整体占空间大小 |
        | pri.store.size | 主分片占空间大小 |
        ### 文档基本操作
        #### 创建文档
        + http://127.0.0.1:9200/shopping/_doc
        + post请求
        + 请求体内容
        + ```json
        {
        "title":"小米手机",
        "category":"小米",
        "images":"http://www.gulixueyuan.com/xm.jpg",
        "price":3999.00
        }
  • 返回结果

    • {
          "_index"【索引】 : "shopping",
          "_type"【类型-文档】 : "_doc",
          "_id"【唯一标识】 : "Xhsa2ncBlvF_7lxyCE9G", #可以类比为 MySQL 中的主键,随机生成
          "_version"【版本】 : 1,
          "result"【结果】 : "created", #这里的 create 表示创建成功
          "_shards"【分片】 : {
              "total"【分片 - 总数】 : 2,
              "successful"【分片 - 成功】 : 1,
              "failed"【分片 - 失败】 : 0
          },
          "_seq_no": 0,
          "_primary_term": 1
      }  
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      + 自定义ID创建
      + 创建时指定:http://127.0.0.1:9200/shopping/_doc/1
      + 注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT
      #### 修改文档
      + 完全覆盖,与创建文档一致,但是要使用put操作,请求体中写入覆盖的数据
      + 局部更新
      + 使用POST方式,
      + http://127.0.0.1:9200/shopping/_update/2001
      + 报文体中写入要更新的数据
      #### 删除文档
      #### 主键查询和全查询
      + 主键查询
      + http://127.0.0.1:9200/shopping/_doc/1001
      + get
      + 返回结果
      + ```json
      {
      "_index"【索引】 : "shopping",
      "_type"【文档类型】 : "_doc",
      "_id": "1",
      "_version": 2,
      "_seq_no": 2,
      "_primary_term": 2,
      "found"【查询结果】 : true, # true 表示查找到, false 表示未查找到
      "_source"【文档源信息】 : {
      "title": "华为手机",
      "category": "华为",
      "images": "http://www.gulixueyuan.com/hw.jpg",
      "price": 4999.00
      }
      }
  • 全部查询

高级用法

条件查询

  • http://127.0.0.1:9200/shopping/_search?q=属性名:属性值
  • 也可以使用请求体
    • {
          "query": {
              "match": {
                  "category": "小米"
              }
          },
          //高亮显示
          "highlight":{
              "fields":{
                  "属性值k1":""
              }
          }
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      + ```json
      //全量查询
      {
      "quer":{
      "match_all":{
      }
      },
      //分页查询
      "from":0, //其实索引
      "size":2, //页容量
      //选择要回显的内容
      "_source":[
      "属性值key1",
      "属性值key2"
      ],
      //排序
      "sort":{
      "属性值key3":{
      "order":"asc"
      }
      }
      }

组和查询

  • {
        "query":{
            "bool":{
                //必须命中的条件
                "must":[
                    {
                        "match":{
                           "category": "小米",
                        }
                    },
                    {
                        
                        "match":{
                           "属性k2": "属性v2",
                        }
                    }
                ],
                //or条件
                "should":{
                    {
                        "match":{
                           "属性k3": "属性v3",
                        }
                    }
                },
                //范围查询
                "filter":{
                    "range":{
                        "属性值4":{
                            //大于
                            "gt":"",
                            //小于
                            "lt":""
                        }
                    }
                }
            }
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
      
    ### 聚合操作
    + ```json
    {
    //聚合操作
    "aggs":{
    //自定义统计结果名称
    "price_group":{
    //分组
    "terms":{
    //分组字段
    "field":"price"
    }
    },
    "price_avg":{
    "avg":{
    "field":"price"
    }
    }
    }
    }

映射关系

  • {
        "properties":{
            "name":{
                "type":"text",
                //是否可以被索引 
                "index":true
            },
            "sex":{
                //不能够分词,必须完整匹配
                "type":"keyword",
                "index":true
            }
        }
    }
    

01-ElasticSearch
https://x-leonidas.github.io/2022/02/01/11技术栈/Lucene/01-ElasticSearch/
作者
听风
发布于
2022年2月1日
更新于
2022年5月5日
许可协议