1.rest基本介绍
REST全称Representational State Transfer。是一种软件的架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。其实说白了就是类似HTTP的访问,和HTTP非常的相似。
rest相关操作有:
-GET:获取对象的当前状态;
-PUT:改变对象的状态;
-POST:创建对象;
-DELETE:删除对象;
-HEAD:获取头信息;
例:
资源 | 一组资源的URI,比如:http://zzy.com/res/ | 单个资源的URI,比如:http://z.com/res/123 |
GET | 列出URI,以及该资源组中每个资源的详细信息 | 获取指定资源的详细信息,格式可以自选一个合适的网络资源媒体类型(json、xml) |
PUT | 使用给定的一组资源替换当前整组资源 | 替换/创建指定资源,并将其追加到相应的资源中 |
POST | 在本组资源中创建/追加一个新的资源,该操作往往返回一个新的URL | 把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源 |
DELETE | 删除整组资源 | 删除指定的元素 |
ES中内置的rest接口:
URL | 描述 |
/index/_search | 搜索指定索引下的数据 |
/_aliases | 获取或操作索引的别名 |
/index/ | 查看指定索引的详细信息 |
/index/type/ | 创建或操作类型 |
/index/_mapping | 创建或操作mapping |
/index/_setting | 创建或操作设置(number_of_shards) |
/index/_open | 打开指定被关闭的索引 |
/index/_close | 关闭指定索引 |
/index/_refresh | 刷新索引(使新加内容对搜索可见,不保证数据被写入磁盘) |
/index/flush | 刷新索引(会触发Lucene提交) |
2.使用CURL去操作ES
url是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求。简单的认为是可以在命令行下面访问url的一个工具。在centos的默认库里面是有curl工具的,如果没有请yum安装即可。
curl的基本操作:
Ø -x 指定http的请求方法 有HEAD GET POST PUT DELETE
Ø -d 指定要传输的数据
Ø -H 指定http请求头信息
(1)创建索引库
语法:curl -XPUT http://<ip>:9200/index_name/
例:curl -XPUT 'http://test:9200/zzy'
(2)创建索引
curl -H "Content-Type: application/json" -XPOST 'http://test:9200/zzy/info/1' -d ' {"name":"hadoop", "author":"Doug Cutting", "core":["hdfs","mr","yarn"], "last_version":3.0 }'
在这里对初学者小编需要补充几点:
PUT和POST的区别:
PUT是幂等方法,POST不是。所以PUT用户更新,POST用于新增比较合适。创建操作可以使用POST,也可以使用PUT,区别就在于POST是作用在一个集合资源(/articles)之上的,而PUT操作是作用在一个具体资源之上的(/articles/123),比如说很多资源使用数据库自增主键作为标识信息,这个时候就需要使用PUT了。而创建的资源的标识信息到底是什么,只能由服务端提供时,这个时候就必须使用POST。
ES创建索引库和索引的注意点:
* 索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号。
* 如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需要使用POST参数。
例:(不指定id)
curl -H "Content-Type: application/json" -XPOST 'http://test:9200/zzy/info/' -d ' {"author" : "Doug Cutting"}'
例:(创建全新的数据)
curl -H "Content-Type: application/json" -XPOST 'http://test:9200/zzy/info/2?op_type=create' -d ' {"name" : "hbase"}'
(3)查询操作
例1(查询所有):
curl -XGET //注意?pretty表示让出现的json好看一些
例2:(检索文档中的一部分,显示特定的字段内容)
curl -XGET 'http://test:9200/zzy/info/1?_source=name,author&pretty'
例3:(根据条件查询)
curl -XGET 'http://test:9200/zzy/info/_search?q=name=hadoop&pretty'
(4)更新操作
ES可以使用PUT/GET对文档进行更新,如果指定ID的文档已经存在,则执行更新操作。
ES在执行更新操作的时候,首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立即消失,但是也无法访问,ES会继续添加更多数据的时候在后台清理已经标记删除状态的文档。
例:(局部更新)
curl -H "Content-Type: application/json" -XPOST http://test:9200/zzy/info/1/_update -d '{ "doc":{"name" : "apache-hadoop"} }' //注意:"doc":{"name" : "apache-hadoop"}可以执行更新,也可以执行插入。
(5)删除操作
例:(普通删除,根据id删除)
curl -XDELETE http://test:9200/zzy/info/2/
注意:
如果文档存在,es属性found:true,successful:1,_version属性的值+1。
如果文档不存在,es属性found为false,但是版本值version依然会+1,这个就是内部管理的一部分,有点像svn版本号,它保证了我们在多个节点间的不同操作的顺序被正确标记了。
一个文档被删除之后,不会立即生效,他只是被标记为已删除。ES将会在你之后添加更多索引的时候才会在后台进行删除。
(6)bulk操作
例:
curl -H "Content-Type: application/json" -XPOST 'http://test:9200/bank/accout/_bulk?pretty' --data-binary "@account.json"
Bulk会把将要处理的数据载入内存中,所以一次批处理的数据量是有限的,一般建议是1000~5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5~15MB,默认不能超过100M,可以在es的配置文件中修改这个值:http.max_content_length:100mb
3.ES的版本控制
(1)普通数据库和ES的控制数据读取的策略:
普通的关系型数据库使用的时候是当我们读取一个数据前先锁定这一行,然后确保只有读到数据的这个线程可以修改这一行。而ES使用的是(乐观并发控制),ES不会阻止某一个数据的访问,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候由程序来决定如何处理这个冲突,可以是重新读取更新后的数据,也可能将这个失败情况直接反馈给用户。
(2)ES实现版本控制:
//首先得到需要修改的文档,获取版本号 curl -XGET http://test:9200/zzy/info/1?pretty
//然后在执行更新操作的时候把版本传过去 curl -H "Content-Type: application/json" -XPUT http://test:9200/zzy/info/1?version=2 -d '{ "name":"hadoop","version":4}' //注意这是个覆盖操作
注意:如果传递的版本号和待更新的文档的版本号不一致,则会更新失败
(3)ES外部版本:
如果数据库已经存在了版本号,或者是可以代表版本的时间戳,这时就可以在ES的查询url后面添加version_type=external来使用这个号。版本号码必须要是大于0小于9223372036854775807(Java中long的最大正值)的整数。并且es在处理外部版本号的时候,它不再检查_version是否与请求中指定的数值是否相等,而是检查当前的_version是否比指定的数值小,如果小,则请求成功。
例:
curl -H "Content-Type: application/json" -XPUT 'http://test:9200/zzy/info/3?version=10&version_type=external' -d ' {"name": "flink"}'