微服务进阶整合学习高级篇--ElasticSearch

搜索分析引擎ElasticSearch

ElasticSearch三大基本概念

1. index-索引

EL中,index索引区别与Mysql中的索引。EL建立一个索引等同于在Mysql数据库中建立一个数据库。动词:相当于mysql的insert;名词:相当于mysql的db

2. type-类型

type在EL中等同与在Mysql中数据库的某一个表。

3. document-文档

document在EL中等同于在Mysql中的一条条的数据,不同的是这些数据是没有像mysql那样具有固定的列属性的。

  1. mysql与el的对应关系,如下图表格所示:
Mysql ElasticSearch
DataBase Index
Table Type
Data Document

docker安装ElasticSearch

1. 切换到管理员su root下载docker或者在命令前加上sudo

(sudo) docker pull elasticsearch:7.4.2
(sudo) docker pull kibana:7.4.2

2. free -m查看内存使用情况

3. 创建目录供后续进行磁盘挂载

#mkdir -p递归创建目录
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data

4. 创建配置文件并写入数据

# es可以被远程任何机器访问
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml

5. 进行磁盘挂载

# -e指定是单阶段运行
# -e指定占用的内存大小
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e  "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2 

# 设置开机启动elasticsearch
docker update elasticsearch --restart=always

6. 赋予EL权限

# 递归更改权限,es需要访问
chmod -R 777 /mydata/elasticsearch/

7. 访问端口查看是否配置成功

http://192.168.56.10:9200

8. 安装启动kibana

# kibana指定了了ES交互端口9200
# 5600是kibana主页端口
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.4.2

9. 访问kibana首页

http://192.168.56.10:5601

ElasticSearch基本入门

1. _cat命令

http://192.168.56.10:9200/_cat/nodes--查看所有的节点
http://192.168.56.10:9200/_cat/health--查看EL健康情况
http://192.168.56.10:9200/_cat/master--查看主节点信息
http://192.168.56.10:9200/_cat/indices--查看所有数据库

2. put/post请求新增

post请求
http://192.168.56.10:9200/customer/external/1
json:{
   "name":"test"}

put请求
http://192.168.56.10:9200/customer/external/1
json:{
   "name":"test"}

两者本质效果都一样,意思是往customer数据库中的external表插入id为1的数据,具体数据为json格式的数据,但是post和put又有区别

post put
可以不写id,自动生成id 必须写id
id不存在则插入,存在则更新 必须写id
用于新增 可用于新增或者修改
版本号不一定会增加 版本号version一定会增加

3. get请求查看文档

get请求https://ElasticSearch地址与端口/索引名/类型名/id主键
http://192.168.56.10:9200/customer/external/1

在这里插入图片描述

4. put请求进行更新

可以通过版本号来对数据进行修改,其中_seq_no是并发控制字段,每次更新都会+1。_primary_term是主分片重新分配,如重启,就会变化
在这里插入图片描述
版本号不一致发生的更新错误情况。
在这里插入图片描述

5. post请求+_update命令更新文档

POST customer/externel/1/_update   ---后面跟了_update一定要带doc,不然报错,比较内容如果一致,版本号不会变化  
{
   
    "doc":{
   
        "name":"111"
    }
}
或者
POST customer/externel/1  --doc可带可不带,版本号一定会变化
{
   
    "doc":{
   
        "name":"222"
    }
}
或者
PUT customer/externel/1   ---put版本号会变化
{
   
    "doc":{
   
        "name":"222"
    }
}
或者
PUT customer/externel/1   ---put版本号会变化
{
   
        "name":"222"
}

6. 删除操作

# ElasticSearch只能删库(Index)或者删数据(document),不能删除表(type)
DELETE customer/external/1
DELETE customer

7. 批量操作_bulk指令

语法格式

#一行为一次操作,该操作只能在kibana上执行,post满无法识别换行
#对整个es实体进行操作
POST /_bulk
{
   "delete":{
   "_index":"website","_type":"blog","_id":"123"}}

{
   "create":{
   "_index":"website","_type":"blog","_id":"123"}}
{
   "title":"my first blog post"}

{
   "index":{
   "_index":"website","_type":"blog"}}
{
   "title":"my second blog post"}

{
   "update":{
   "_index":"website","_type":"blog","_id":"123"}}
{
   "doc":{
   "title":"my updated blog post"}}

8. 测试数据

ElasticSearch高级检索测试数据

ES进阶

1. ES开发文档

2. QueryDSL格式查询

#假如数据量够多,默认返回10条数据,不回全部返回所有数据。
GET /bank/_search
{
   
  "query": {
    
    "match_all": {
   } #查询的字段,为空则表示查询所有
  },
  "from": 0,  #从第几条开始查
  "size": 5,  #查询多少条记录
  "_source":["balance"],  #要返回的字段
  "sort": [   #排序
    {
   
      "account_number": {
     #按照哪个字段排序
        "order": "desc"    #排序的顺序
      }
    }
  ]
}

3. query/match匹配查询

  1. 当匹配的类型为非字符串的时候,进行精确匹配,相当于mysql中的 where xxx = xxx
GET bank/_search
{
   
  "query": {
   
    "match": {
   
      "account_number": "20" #  字段名:值
    }
  }
}

#返回数据
{
   
  "took" : 14,
  "timed_out" : false,
  "_shards" : {
   
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
   
    "total" : {
   
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
   
        "_index" : "bank",
        "_type" : "account",
        "_id" : "20",
        "_score" : 1.0,
        "_source" : {
   
          "account_number" : 20,
          "balance" : 16418,
          "firstname" : "Elinor",
          "lastname" : "Ratliff",
          "age" : 36,
          "gender" : "M",
          "address" : "282 Kings Place",
          "employer" : "Scentric",
          "email" : "elinorratliff@scentric.com",
          "city" : "Ribera",
          "state" : "WA"
        }
      }
    ]
  }
}

  1. 当匹配的类型为字符串的时候,进行全文检索,相当于mysql中的where xxx like ‘%xxx%’。会进行分词查询
GET bank/_search
{
   
  "query": {
   
    "match": {
   
      "address": "kings"
    }
  }
}

#返回结果
{
   
  "took" : 23,
  "timed_out" : false,
  "_shards" : {
   
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
   
    "total" : {
   
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 5.9908285,
    "hits" : [
      {
   
        "_index" : "bank",
        "_type" : "account",
        "_id" : "20",
        "_score" : 5.9908285,
        "_source" : {
   
          "account_number" : 20,
          "balance" : 16418,
          "firstname" : "Elinor",
          "lastname" : "Ratliff",
          "age" : 36,
          "gender" : "M",
          "address" : "282 Kings Place",
          "employer" : "Scentric",
          "email" : "elinorratliff@scentric.com",
          "city" : "Ribera",
          "state" : "WA"
        }
      },
      {
   
        "_index" : "bank",
        "_type" : "account",
        "_id" : "722",
        "_score" : 5.9908285,
        "_source" : {
   
          "account_number" : 722,
          "balance" : 27256,
          "firstname" : "Roberts",
          "lastname" : "Beasley",
          "age" : 34,
          "gender" : "F",
          "address" : "305 Kings Hwy",
          "employer" : "Quintity",
          "email" : "robertsbeasley@quintity.com",
          "city" : "Hayden",
          "state" : "PA"
        }
      }
    ]
  }
}

4. query/match_phrase [不拆分匹配]

  1. 该匹配检索的关键词不会进行分词处理
GET bank/_search
{
   
  "query": {
   
    "match_phrase": {
   
      "address": "mill road"   #将mill road当成一个搜索关键词进行处理,而不是进行分词成mill || road进行查询
      #相当于mysql中的where xxx like 
    }
  }
}
  1. 或者通过字段.keyword进行全匹配查询,该查询区分大小写,相当于mysql中where xxx = xxx
GET bank/_search
{
   
  "query": {
   
    "match": {
   
      "address.keyword": "mill road"   
    }
  }
}
query/match/字段 query/match_phrase/字段 query/match/字段.keyword
分词 不分词 不分词
模糊查询 模糊查询 全匹配查询

5. query/multi_math[多字段匹配]

  1. 相当于指定mysql中某一列的条件,如:select from xxx where xxx = xxx
    and xxx like xxx and xxx like xxx。该查询会进行分词处理。
GET bank/_search
{
   
  "query": {
   
    "multi_match": {
     # 前面的match仅指定了一个字段。
      "query": "mill road", # 要检索的关键词,会进行分词处理
      "fields": [ # 在state,address里进行检索。要求state和address有mill子串,不要求都有
        "state",
        "address"
      ]
    }
  }
}

#返回结果
{
   
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
   
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
   
    "total" : {
   
      "value" : 32,
      "relation" : "eq"
    },
    "max_score" : 8.926605,
    "hits" : [<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值