1.rest基本介绍html
REST全称Representational State Transfer。是一种软件的架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件能够更简洁,更有层次,更易于实现缓存等机制。其实说白了就是相似HTTP的访问,和HTTP很是的类似。java
rest相关操做有:
数据库
-GET:获取对象的当前状态;apache
-PUT:改变对象的状态;json
-POST:建立对象;centos
-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"}'