(二)elasticsearch初步探索

ES作为一个检索、存储、分析的引擎,其将所有的操作都以restful api的方式实现

1._cat查询ES的信息

http://192.168.254.128:9200/_cat/nodes查看所有节点
http://192.168.254.128:9200/_cat/health查看健康状况
http://192.168.254.128:9200/_cat/master查看主节点
http://192.168.254.128:9200/_cat/indices查看所有索引

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.向ES中索引(保存)一个文档

相当于关系型数据库的insert操作,在向ES保存数据时,我们需要指定保存在哪个索引的哪个类型下,指定用哪个唯一标识

例如:在customer索引下的external保存1号数据

PUT customer/external/1
{
    "name":"bigbear"
}

PUT和POST都可以,区别在于:

        POST新增时,如果不指定id,会自动生成id,指定id就会修改这个数据,并且新增版本号。

        PUT可以新增可以修改,PUT必须指定id,由于PUT必须要指定id,我们一般用来做修改操作,不指定id会报错。

 

 

 

 

 

 

 

可以看到数据的result为create(新增),当再发送这个请求时,result将会变为update,且版本号有叠加,当PUT请求我们不带id,ES返回405

当使用POST请求时,我们未指定id,id为自动生成

3.查询文档

当我们查询正确的索引的类型的id时,found字段为true,并给我们返回了数据,但是当我们查询不存在的id时,found字段为false,如果不带id去查询,则返回405

查询返回字段说明:

{
	"_index": "customer",        // 在哪个索引
	"_type": "external",         // 在哪个类型  
	"_id": "1",                  // 记录id
	"_version": 2,               // 版本号
	"_seq_no": 1,                // 并发控制字段,每次更新会+1,用来做乐观锁
	"_primary_term": 1,          // 同上,主分片重新分配,如重启,就会变化
	"found": true,
	"_source": {
		"name": "bigbear"
	}
}

当A、B、C都向ES发送请求要修改数据时,修改时,我们可以根据_seq_no看是否满足修改条件,比如3个请求都想修改_seq_no为1时的数据,如果ES先处理了某个请求,这时候的_seq_no就会叠加,当别的请求再想修改数据时,_seq_no已经不是1了,所以不会修改数据,这样就能达到并发控制效果。

我们模拟多个请求修改数据,当_seq_no为1时修改数据

现在_seq_no是1,满足修改条件

发起请求修改数据http://192.168.254.128:9200/customer/external/1?if_seq_no=1&if_primary_term=1,修改成功后,_seq_no叠加

当再次发起请求,则会返回异常,因为上一个请求修改成功后,_seq_no已经叠加

4.更新文档

POST /customer/external/1/_update

{
    "doc":{
        "name":"tingting"
    }
}

或者

POST /customer/external/1

{"name":"tingting"}

 

或者

PUT /customer/external/1

 

 

 

 

 

 

 

 

_update的形式更新时,参数必须要doc属性,修改成功时,result为updated

当我们再次以POST _update方式更新文档时,result为noop(即无操作)。_update方式更新时,会对比原数据,如果修改数据与原数据一样,则ES不做操作,_version和_seq_no不会叠加

当以POST或PUT请求更新文档时,不会比对原数据,每次都会时update操作,_seq_no和_version都会叠加

5.删除文档或索引

DELETE /customer/external/1
DELETE /customer

 

 

 

ES只有删除文档或索引操作,未提供删除类型操作,当我们删除了文档之后,result为deleted,再发送请求去删除文档时,result为not_found。再查询文档时,会返回404状态码。

删除索引后,如果再查询文档,则会返回404状态码,且返回异常信息

6.批量操作

POST /customer/external/_bulk

{"index":{"_id":1}}

{"name":"Jony"}

 

{"index":{"_id":2}}

{"name":"candy"}

复杂实例

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 update blog post"}}

 

 

 

 

 

 

 

 

 

由于批量操作用postman不太好测试,我们将使用kibana的dev tools测试

ES批量添加数据,数据的添加是独立的,即使失败也不会影响其他数据的添加,这与关系型数据库的事务有区别

这里添加了两个文档,所以items数组有两个对象

复杂操作我们做了4个操作,因此items有4个对象

ES官方给出一份测试数据

https://github.com/elastic/elasticsearch/edit/master/docs/src/test/resources/accounts.json

我们可以copy出来做学习使用

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页