elastic search 基本操作

来源:互联网 发布:angular.js中文社区 编辑:程序博客网 时间:2024/05/29 09:36

转自大数据学习平台:大讲台: http://www.dajiangtai.com/course/search.do?search=elastic

一、Restful web API

elastic search提供了Restful web API,先说一下什么是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;...

服务器的响应头:

  1. Content-Length:
    Content-Type:

    application/json; charset=UTF-8
    356

  2. 响应body:
  3. {  "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个节点...
    • 我们请求的资源,在那个时间点下的状态,就通过如上的格式表述了出来。这就是表述性状态。

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

  5. <name>node-0</name>
  6. <cluster_name>escluster</cluster_name>
  7. ...

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


  9. 简单举例:上面的那个请求,当我们关掉一个节点的服务,而后再次请求时,状态如下:
    1. 响应body:
    2. {  "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}
    3. 响应信息显示,es集群当前状况良好,有2个节点...
    4. 以上。
    1. 2、REST是一种软件架构风格
    1. 虽然以上举例都是用http请求,但REST并不局限于web,而是因为REST通常被用于web系统中。非web的系统例如提供Service服务的后台系统同样也可以是REST风格的。
    2. REST是针对架构的一组约束条件和原则,满足这些约束和原则的架构,就是RESTful架构。

    1. 二、CURL

    1. 1、用法 curl [options]  url
    1. -d/--data             HTTP POST data(parama=valuea&paramb=valueb)
    1. -X/--request <command>        Specify request command to use 
    2. -v/--verbose  显示详细信息
          2、PUT 与POST 
               PUT与DELETE都是幂等操作,一般用于更新操作。
                    幂等性是指即不论重复执行多少次,其对数据库所造成的结果都是一样的。例如更新id为1的name字段的值为liylnew,无论多少次发出此请求,结果都是将name的值更新为liylnew。
               POST不是幂等操作,一般用于新增操作。比如常见的POST重复加载问题。当我们多次发出同样的POST请求后,其结果是创建出了若干资源。
     3、如果只是想看一下文档是否存在,则HEAD,head只返回response head 
     4、如果只想局部更新则只能用POST
三、API

1、 创建

url:/{index}/{type}/{documentid}

例:
curl -XPOST http://hadoop01:9200/djt/user/1 -d '{"name":"liyl","age":35}'
{"_index":"djt","_type":"user","_id":"1","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}

创建了一个索引库名称为djt,同时在此索引库下创建一个名称为user的类型,再创建一个documt,id为1。


2、在type已存在的情况下创建一个指定id的document
    curl -XPUT http://hadoop01:9200/{index}/{type}/{documentid}?op_type=create  -d '{"name":"liyl2"}'
     或者
     curl -XPUT http://hadoop01:9200/{index}/{type}/{documentid}/_create  -d '{"name":"liyl2"}'
     如果没有指定id,需要自增id的话,则只能用如下的方式:
     curl -XPUT http://hadoop01:9200/{index}/{type}/   -d '{"name":"liyl2"}'
     
3、查询
     GET /{index}/{type}/{documentid}   根据Id查询
     或者
     GET /{index}/{type}/_mget -d '{"ids":[1,3]}'
     GET /{index}/{type}/{documentid}?_source=name  只显示指定字段

     GET /{index}/{type}/_search  查询所有  
      GET /{index}/{type}/_search?q=name:liyl  条件查询

4、更新
     POST  /{index}/{type}/{documentid}/_update   -d {"docs":{"name":"liyl","age":22}}

5、批量操作

     {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、并发控制(事务)
     普通关系型数据库使用的是悲观锁进行并发控制(PCC)
     es使用的是乐观锁进行并发控制(OCC):
     es不会阻止对正在被其它线程更新的数据的访问,但是如果数据在读取和写入的中间发生了变化,写入就会失败。这需要客户端自行处理这种失败。客户端可以选择重新读取数据,再更新。也可以选择反馈给用户。
     es的乐观锁的实现:
     读取文档时,获得版本号
     更新文档时,会把版本号传过去,es会检查要被更新的数据的最新版本号与传递过来的版本号是否相同,如果不相同,则返回失败。