• ElasticSearch之路


    国人教程

    视频教程:b站狂神说(springboot后面的不用看,因为公司不一定用starter去开发,熟练基础才是重点)

    概念

    ELK软件栈

    • Kibana:负责数据展示等
    • ElasticSearch:负责搜索等
    • Logstash:负责数据采集等

    安装

    ES

    • mac下载gz文件并解压
    • 进入bin目录运行elasticsearch脚本即可
    • 使用浏览器或curl测试http://localhost:9200

    Kibana

    • mac下载gz文件并解压
    • 进入bin目录运行kibana脚本即可
    • 使用浏览器访问http://localhost:5601
    • conf/kibana.yml进行汉化配置i18n.locale: "zh-CN"

    入门使用:https://elasticstack.blog.csdn.net/article/details/103118342(入门1即可+介绍)

    开发工具实现REST请求

    IK分词器(玩玩)

    github地址

    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
    
    • 1

    重要概念

    集群cluster

    由各种node构成,master node 管理集群,包括索引的创建、添加、删除等、data node 用于存放数据

    节点node

    相当于一个es实例。有很多种类型,如master/data node 等

    索引index

    文档的集合体,相当于mysql的database

    类型type

    相当于数据库的表,6之后由于一个index只对应一个type(默认_doc),因为多个type中存在相同字段会混乱。

    他能够动态的修改Mapping,也就是你添加一个字段,他会动态生成字段和类型的映射。而不像传统数据库,需要先定义字段类型,也就是create table

    分片shard

    索引的分片,将文档通过哈希计算落在不同分片,减少大索引(10亿文档)无法存储以及读取效率差的问题。

    分为主分片(读写)和副本分片(只读),副本分片可提升为主分片

    GET/PUT  /索引/_settings  #添加修改
    
    • 1

    如果是集群,也就是非单节点,主分片和副分片是存放在不同节点的,这样就能保证,即便一个node坏了,也不会丢失数据

    命令操作

    查看ES信息

    创建索引

    💡如果类型不指定,对于传值需要保证类型一致,否则报错

    ES

    基本要求:掌握集群部署 ,了解基本配置项的含义。掌握常用的的接口功能,包括数据、分片的增删改查等操作

    使用Java调通读写操作

    #索引文档操作

    创建或修改db1索引

    PUT/POST

    PUT db1
    {
      "mappings": {
        "properties": {
          "name":{
            "type": "text"
          },
          "age":{
            "type": "long"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    查看索引
    GET db1
    
    • 1
    删除索引
    DELETE db1
    
    • 1
    添加或修改文档

    PUT/POST

    PUT db1/_doc/1
    {
      "name":"迪哥",
      "age":17
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    💡1代表该文档的一个唯一id

    局部修改文档

    上面的添加重复执行的话只会修改,但是是全局覆盖,例如你要改年龄,但这样会导致迪哥不见了。虽然你可以重新把name字段也写上去。但如果字段多就麻烦了,所以我们需要局部修改。

    # 迪哥丢失
    PUT db1/_doc/1
    {
      "age":18
    }
    # 使用_update 局部修改
    POST db1/_doc/1/_update
    {
      "doc":{
        "age":20
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    创建文档的同时创建索引
    PUT db/_doc/1
    {
      "name":"知道尼玛"
    }
    # 创建第二条文档
    PUT db/_doc/2
    {
      "name":"知道尼玛"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    查看文档2
    GET db/_doc/2
    
    • 1
    删除文档2
    DELETE db/_doc/2
    
    • 1
    查看全部文档
    GET db/_doc/_search
    
    • 1

    #搜索GET

    keyword和text类型,keyword类型不会被分词,作为整体,但text类型会被分词,而且英文和中文的分词也不一样,英文是按空格,中文是按字

    模糊搜索
    # _source只查询指定字段  sort用于排序  from size用于分页
    GET db/_doc/_search
    {
      "query": {
        "match": {
          "name": ""
        }
      }
      , "_source": ["name"]
      , "sort": [
        {
          "name.keyword": {
            "order": "desc"
          }
        }
      ],
    	"from":0,
      "size":1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    存在问题:如果name字段的类型是由创建索引时指定,且没有添加fields keyword(而使用如果创建索引的同时创建文档时,类型会自动判断,且会生成fields keyword),此时name字段是无法进行排序的(可能是因为他不是关键字,不知道如何排序–可分词),但像long类型则没有这种情况,因为数字类型是精确匹配的,没有所谓的分词。这个时候有两种解决方法

    # 1.根据报错提示添加fielddata
    POST db2/
    {
      "mappings": {
          "properties": {
            "name": {
              "type": "text",
              "fielddata":true
            }
          }
      }
    }
    # 2.使用name.keyword进行排序
     "sort":{
        "name.keyword":{
          "order":"desc"
        }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    精确查询?

    term 通过倒排索引进行精确查询

    match 通过分词器解析

    # 类似should
    GET db/_doc/_search
    {
      "query":{
        "match":{
          "name": "zdm 霍格"
        }
      }
    }
    # term
    GET db3/_doc/_search
    {
      "query":{
        "term":{
          "name": "zdm"
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    多条件查询

    # bool查询  多条件 must(and)  should(or)  must_not(取反)
    GET db/_doc/_search
    {
      "query":{
        "bool":{    
          "must": [
            {
              "match":{
                "name": "地"
              }
            },
            {
              "match": {
                "age": 17
              }
            }
          ]
        }
      }
    }
    # 添加过滤  lt gt   less/greater than 
    GET db/_doc/_search
    {
      "query":{
        "bool":{    
          "filter": {
            "range":{
              "age":{
                "lt":18
              }
            }
          }
        }
      }
    }
    
    • 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
    • 32
    • 33
    • 34
    • 35

    查看集群信息

    GET /
    GET /db/_shard_stores
    GET /db/_settings
    GET _cluster/state
    GET _cluster/health
    
    • 1
    • 2
    • 3
    • 4
    • 5
    GET _cat/health # 系统健康
    GET _cat/nodes  #系统节点情况
    GET _cat/shards #系统分片情况
    # 索引情况
    GET _cat/indices?v
    GET _cat/indices/db
    GET /db/_shard_stores
    GET /db/_settings
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    香橙派5plus从ssd启动Ubuntu
    从老王三角到忍狠美三字诀
    给虚拟机配置固定局域网IP
    Codeforces Round #724 (Div. 2) C. Diluc and Kaeya
    Android8.1 MTK 去掉锁屏功能
    一键批量剪辑:视频随机分割新玩法,高效剪辑不再难
    深刻理解JAVA并发中的有序性问题和解决之道
    K-means聚类是一种非常流行的聚类算法
    DecimalFormat的使用讲解数字格式化和demo(java小数控制,金额返回相关处理)
    MongoDB聚合运算符:$setDifference
  • 原文地址:https://blog.csdn.net/qq_45833812/article/details/127417845