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

重要概念

集群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  #添加修改

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

命令操作

查看ES信息

创建索引

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

ES

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

使用Java调通读写操作

#索引文档操作

创建或修改db1索引

PUT/POST

PUT db1
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      },
      "age":{
        "type": "long"
      }
    }
  }
}
查看索引
GET db1
删除索引
DELETE db1
添加或修改文档

PUT/POST

PUT db1/_doc/1
{
  "name":"迪哥",
  "age":17
}

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

局部修改文档

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

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

#搜索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
}

存在问题:如果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"
    }
  }
精确查询?

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

match 通过分词器解析

# 类似should
GET db/_doc/_search
{
  "query":{
    "match":{
      "name": "zdm 霍格"
    }
  }
}
# term
GET db3/_doc/_search
{
  "query":{
    "term":{
      "name": "zdm"
    }
  }
}

多条件查询

# 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
          }
        }
      }
    }
  }
}

查看集群信息

GET /
GET /db/_shard_stores
GET /db/_settings
GET _cluster/state
GET _cluster/health
GET _cat/health # 系统健康
GET _cat/nodes  #系统节点情况
GET _cat/shards #系统分片情况
# 索引情况
GET _cat/indices?v
GET _cat/indices/db
GET /db/_shard_stores
GET /db/_settings
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值