elastic search 基本操作

ES提供了Restful web API

1.REST (REpresentational State Transfer)——表述性状态转移

状态是指网络上的某个资源在某个时间点下的数据呈现,表述性指将状态用一定的格式表述出来。
简单举例如下:比如说在北京时间20170929 08:55:06.986这个时间点,我们想查看下es集群的状态,于是发送了一个HTTP GET请求:

GET /_cluster/health?pretty HTTP/1.1
Host: hadoop01:9200
Accept: text/html,application/xhtml+xml,application/xml;... 

服务器的响应头:

Content-Length:356
Content-Type:application/json; charset=UTF-8

响应body:

{
  "cluster_name" : "escluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 4,
  "active_shards" : 8,
  "relocating_shards" : 1,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

响应信息显示,es集群当前状况良好,有3个节点…

我们请求的资源,在那个时间点下的状态,就通过如上的格式表述了出来。这就是表述性状态。

当然同一个状态可以通过不同的格式表述,即资源的多重表述。如上资源也可以通过xml的格式表述:

node-0
escluster...

转移是指资源在不同时间点下呈现不同的状态,即资源从一个状态转移到了另一个状态。

简单举例:上面的那个请求,当我们关掉一个节点的服务,而后再次请求时,状态如下:

响应body:

{
  "cluster_name" : "escluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 4,
  "active_shards" : 8,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

响应信息显示,es集群当前状况良好,有2个节点…
以上。

2.REST是一种软件架构风格

虽然以上举例都是用http请求,但REST并不局限于web,而是因为REST通常被用于web系统中。非web的系统例如提供Service服务的后台系统同样也可以是REST风格的。
REST是针对架构的一组约束条件和原则,满足这些约束和原则的架构,就是RESTful架构。

二、CURL

  1. 用法:curl [options] url
-d/--data             #HTTP POST data(parama=valuea¶mb=valueb)
-X/--request         #POST/PUT/HEAD/DELETE  Specify request command to use 
-v/--verbose  #显示详细信息
  1. PUT 与POST
    PUT与DELETE都是幂等操作,一般用于更新操作。
    幂等性是指即不论重复执行多少次,其对数据库所造成的结果都是一样的。例:更新id为1的name字段的值为liylnew,无论多少次发出此请求,结果都是将name的值更新为liylnew。
    POST不是幂等操作,一般用于新增操作。比如常见的POST重复加载问题。当我们多次发出同样的POST请求后,其结果是创建出了若干资源。
  2. 如果只是想看一下文档是否存在,则HEAD,head只返回response head
  3. 如果只想局部更新则只能用POST
ES Restful API
  1. 创建:url /{index}/{type}/{documentId}
    例:
执行:curl -XPOST http://hadoop01:9200/djt/user/1  -d '{"name":"liyl","age":18}'
输出:
{"_index":"djt","_type":"user","_id":"1","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}

创建了一个名称为djt的索引库,并创建了一个名为user的类型,创建了一个document Id为1

  1. 在type已经存在的情况下,创建一个指定id的document
curl -XPUT  http://hadoop01:9200/
/{index}/{type}/{documentId}?op_type=create    -d '{...}'
或者
/{index}/{type}/{documentId}/_create    -d  '{...}'
如果不需指定id,而是自增id
/{index}/{type}/    -d  '{...}'
  1. 查询
curl -XGET http://hadoop01:9200
根据docId查询
/{index}/{type}/{docId}
根据多个docId查询
/{index}/{type}/_mget   -d '{ "ids" : [1,2,3] }'
只显示指定字段
/././{docId}?_source=name
查询所有
/././_search
条件查询
/././_search?q=name:liyl
  1. 更新
curl -XPOST http://.../{docId}/_update -d '{"docs" : { "name" : "liyl" } }'
  1. 批量操作
    {{action}:{metadata}}
    {body}
    action的类型:index/create/update/delete
    (create 与index的区别是:如果数据已经存在,则create操作的结果为failure,index操作的结果为success)

metadata:用于指定要更新的目标,例:

{"_index" : "djt","_type" : "user","_id":1}

body:要更新为的结果。例:
{"docs":{"name":"liyl","age":33}}。
可以有多组,写到同一个文件中,用命令执行:
POST /_bulk --data-binary @文件路径

批量操作建议1000-5000条为一批,大小5M-15M,默认不超过100M,这个上限可以配置:http.max_content_length
6. 并发控制(事务)
1. 普通关系型数据库使用的是悲观锁进行并发控制(PCC)
2. es使用的是乐观锁进行并发控制(OCC):
es不会阻止对正在被其它线程更新的数据的访问,但是如果数据在读取和写入的中间发生了变化,写入就会失败。这需要客户端自行处理这种失败。客户端可以选择重新读取数据,再更新。也可以选择反馈给用户。
3. es的乐观锁的实现:
读取文档时,获得版本号
更新文档时,会把版本号传过去,es会检查要被更新的数据的最新版本号与传递过来的版本号是否相同,如果不相同,则返回失败。

你可能感兴趣的:(elastic)