1.全文搜索(ElasticSearch)

描述

在这里插入图片描述

1.简介:存储 + 检索 + 分析

2.作用:
	1)快速存储、搜索和分析海量数据(比mysql快)
	2)es的数据来自mysql,需要从mysql提取数据到es中
	3)Elastic是Lucene的封装,提供了REST AP|的操作接口
	4)日志处理和分析
    5)基础设施指标和容器监测
    6)应用程序性能监测
    7)地理空间数据分析和可视化
    8)安全分析
    9)业务分析
    
3.端口
	9200:HTTP
	9300:TCP
	5601:kibana

概念

1.lndex(索引):相当于mysql中的databasex!  动词相当于mysql的insert 名称相当于databasex
2.Type(类型):相当于mysql中的table(表)
3.Document(文档):相当于mysql中的一条记录(es以json格式存储)
-----属性就是列名称------

4.倒排索引
	1)es存储数据至索引时,还会同时维护一张倒排索引表
	当插入记录时,会将当前记录拆为单词存入,并保存记录与单词的对应关系
	2)此时检索一条记录"红海特工行动",首先会将记录分词为 "红海"、"特工"、"行动",然后在倒排索引表中匹配单词(不用直接检索文档,比mysql快【mysql需要使用like匹配每一条记录】),并根据相关性得分排序
	3)相关性得分简要说明:例如记录3:3个词命中2个
	  					  记录5:4个词命中2个,记录3得分 > 记录5得分

在这里插入图片描述

在这里插入图片描述

初步检索

1._cat查询

GET 192.168.56.10:9200/_cat/nodes:查看所有节点
GET 192.168.56.10:9200/_cat/health:查看es健康状况
GET 192.168.56.10:9200/_cat/master:查看主节点信息
GET 192.168.56.10:9200/_cat/indices:查看所有索引show databases;

2.新增/修改文档(方法1)

1.使用POST请求
192.168.56.10:9200/customer/external/1
{
    "name": "John Doe"
}
	1)不指定ID,新增一条记录并自动生成ID返回
	2)指定ID,数据不存在则新增,数据存在则修改并新增版本号
解析:
	customer:索引
	external:类型
	1:唯一ID标示


2.使用PUT请求
	1)不指定ID,报错
	2)指定ID,数据不存在则新增,数据存在则修改并新增版本号(一般用于修改)
192.168.56.10:9200/customer/external/1
{
    "name": "John Doe"
}

3.更新操作时,可以新增属性,新增age属性
192.168.56.10:9200/customer/external/1
{
    "name": "John Doe",
    "age": 13
}
新增成功返回参数:【不会返回保存的数据,需要调用GET查询文档数据】
{
    "_index": "customer",// 索引
    "_type": "external",// 类型
    "_id": "1",// 唯一标示
    "_version": 1,// 版本号
    "result": "created",// 操作类型
    "_shards": {// 
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 0,
    "_primary_term": 1
}

3.查询文档(无参查询)

无相关性得分

1.GET请求:索引/类型/唯一标示ID
192.168.56.10:9200/customer/external/1
返回数据组成:索引、类型、id、版本、结果、分片
返回结果:
{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 3,
    "_seq_no": 2,// 并发控制字段,每次更新就会+1,用来作乐观锁
    "_primary_term": 1,// 同上,主分片重新分配,如重启,就会变化
    "found": true,// 查询成功
    "_source": {// 文档数据
        "name": "John Doe"
    }
}

192.168.56.10:9200/customer/external/2
{
    "_index": "customer",
    "_type": "external",
    "_id": "2",
    "found": false// 查询失败
}

4.乐观锁

1.解释CAS(compare and swap):
	比较交换是一个原子操作,获取seq_no值与预期seq_no值比较是否相等,
	1)相等则更新数据
	2)不相等则更新失败,需要重新获取seq_no作为预期值然后做CAS操作
	
2.实现,以下demo使用PUT操作
	1)先查询seq_no作为预期值:192.168.56.10:9200/customer/external/1
	返回值:
{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 3,
    "_seq_no": 2,
    "_primary_term": 1,
    "found": true,
    "_source": {
        "name": "John Doe"
    }
}

	2)带上预期值执行两次CAS操作,只有一个会成功
	当执行第一次时seq_no值被改变,第二次进来预期值与真实seq_no不相等,更新失败
------------------------------------------------------------------
执行第一次
192.168.56.10:9200/customer/external/1?if_seq_no=2&if_primary_term=1
{
    "name": "John Doe2"
}

修改成功,返回:
{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 4,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 3,// 值已更新
    "_primary_term": 1
}
------------------------------------------------------------------
执行第二次,seq_no预期值仍然是2,与实际值seq_no=3不相等,CAS失败
192.168.56.10:9200/customer/external/1?if_seq_no=2&if_primary_term=1
{
    "name": "John Doe3"
}
修改失败返回409
{
    "error": {
        "root_cause": [
            {
                "type": "version_conflict_engine_exception",
                "reason": "[1]: version conflict, required seqNo [2], primary term [1]. current document has seqNo [3] and primary term [1]",
                "index_uuid": "X0p28Y5FQvy344rl9EXhrg",
                "shard": "0",
                "index": "customer"
            }
        ],
        "type": "version_conflict_engine_exception",
        "reason": "[1]: version conflict, required seqNo [2], primary term [1]. current document has seqNo [3] and primary term [1]",
        "index_uuid": "X0p28Y5FQvy344rl9EXhrg",
        "shard": "0",
        "index": "customer"
    },
    "status": 409
}
注:
	老版本用version
	新版本用seq_no

5.修改文档(方法2)

1._update,可以增加字段:
POST	192.168.56.10:9200/customer/external/3/_update
{
    “doc”:{
        "name":"test",
        "age":"13"	// 还可以增加字段
    }
}
与方法1修改文档的区别:
	_update方式修改会对比源数据,如果数据一致没有更改,则result属性值是noop(no operation),且版本号不变,序列号不变
有数据更新时回参:
{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 5,
    "result": "updated",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 4,
    "_primary_term": 6
}

无数据更新时修改回参:
{
    "_index": "customer",
    "_type": "external",
    "_id": "1",
    "_version": 5,
    "result": "noop",
    "_shards": {
        "total": 0,
        "successful": 0,
        "failed": 0
    },
    "_seq_no": 4,
    "_primary_term": 6
}

6.删除数据(索引/类型)

1.删除文档
发送delete请求,指定索引/类型/ID
DELETE 192.168.56.10:9200/customer/external/3

2.删除索引
发送delete请求,指定索引
DELETE 192.168.56.10:9200/customer/external/3

注:没有删除类型操作
返回参数:
{
    "_index": "customer",
    "_type": "external",
    "_id": "3",
    "_version": 2,
    "result": "deleted",
    "_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 6,
    "_primary_term": 6
}

7.批量操作

使用kibana测试:
访问:192.168.56.10:5601=>点击Dev Tools

1.语法格式,两个json体为一个操作(不是事务操作,没有回滚)
例1:指定索引/类型的批量操作,并创建/修改两条文档:【index表示创建或修改操作】
POST customer/external/_bulk
{"index":{"_id":"1"}} 
{"name": "John Doe"}
{"index":{"_id":"2"}}
{"name": "Paul Doe"}
解析:
	1)index:索引一条文档(保存),并指定ID
	2)第二个json体是文档数据

回参:
{
  "took" : 13,// 毫秒数
  "errors" : false,
  "items" : [
    {
      "index" : {
        "_index" : "customer",
        "_type" : "external",
        "_id" : "1",
        "_version" : 6,
        "result" : "updated",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 8,
        "_primary_term" : 6,
        "status" : 200
      }
    },
    {
      "index" : {
        "_index" : "customer",
        "_type" : "external",
        "_id" : "2",
        "_version" : 1,
        "result" : "created",
        "_shards" : {
          "total" : 2,
          "successful" : 1,
          "failed" : 0
        },
        "_seq_no" : 9,
        "_primary_term" : 6,
        "status" : 201
      }
    }
  ]
}

2:在请求url上不指定索引、类型
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","_retry_on_conflict":3}}//更新文档
{"doc":{"title":"My updated blog post"}}

8.导入批量测试数据

POST /bank/account/_bulk
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值