REST
1、REST简介
ElasticSearch
index(索引库) type(类型) document(文档) field(字段)
REST全称Representational State Transfer。是一种软件的架构风格,而不是标准,只是提供了一组设计原则和约束 条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存 等机制。
其实说白了就是类似HTTP的访问,和HTTP非常的相似。 REST操作: GET:获取对象的当前状态; PUT:改变对 象的状态; POST:创建对象; DELETE:删除对象; HEAD:获取头信息。
2、Rest具体操作说明
3、ES内置REST接口
CURL简介
curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求。简单的 认为是可以在命令行下面访问url的一个工具。在centos的默认库里面是有curl工具的,如果没有请yum安装即可。
curl -X 指定http的请求方法 有 HEAD GET POST PUT DELETE -d 指定要传输的数据 -H 指定http请求头信息
- 使用CURL创建索引库、创建索引
curl创建索引库 curl -XPUT http://:9200/index_name/ PUT或POST都可以创建 举例: curl -XPUT 'http://localhost: 9200/bigdata'
创建索引
curl -H 'Content-Type:application/json' -XPOST 'http://localhost:9200/bigdata/product/1' -d '{ "name" : "hadoop", "author" : "Doug Cutting", "core" : ["hdfs","mr","yarn"], "latest_version": 3.0 }'
- 使用CURL进行PUT和POST操作
PUT是幂等方法,POST不是。所以PUT用户更新,POST用于新增比较合适。 PUT和DELETE操作是幂等的。所谓幂 等是指不管进行多少次操作,结果都一样。比如用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没 有什么不同,DELETE也是一样。 POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的 POST请求后,其结果是创建了若干的资源。 还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,
区别就在于POST是作用在一个集合资源(/articles)之上的,而PUT操作是作用在一个具体资源之上的(/articles/123), 比如说很多资源使用数据库自增主键作为标识信息,这个时候就需要使用PUT了。而创建的资源的标识信息到底是什 么,只能由服务端提供时,这个时候就必须使用POST。 ES创建索引库和索引时的注意点 1)索引库名称必须要全部小 写,不能以下划线开头,也不能包含逗号 2)如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需 要使用POST参数 curl -XPOST http://localhost:9200/bigdata/product/ -d '{"author" : "Doug Cutting"}'
如果想要确定创建的都是全新的数据 1:使用随机ID(POST方式) 2:在url后面添加参数 curl -XPOST http://localhos t:9200/bigdata/product/2?op_type=create -d '{"name" : "hbase"}' curl -XPOST http://localhost:9200/bigdata/pr oduct/3/_create -d '{"name" : "hive"}' 如果成功创建了新的文档,ES将会返回常见的元数据以及created为true的反 馈。如果存在同名文件,ES将会返回AlreadyExistsException。 之前的版本如果成功创建了新的文档,Elasticsearch 将会返回常见的元数据以及201 Created的HTTP反馈码。而如果存在同名文件,Elasticsearch将会返回一个409 Conflict的HTTP反馈码
- CURL使用之查询所有
查询所有 -GET 根据产品ID查询 curl -XGET http://localhost:9200/bigdata/product/1?pretty 在任意的查询url中添 加pretty参数,es可以获取更易识别的json结果。 检索文档中的一部分,显示特定的字段内容 curl -XGET http://loca lhost:9200/bigdata/product/1?source=name,author&pretty' source curl -XGET 'http://localhost:9200/bigdata/product/1/source?pretty' 查询所有 curl -XGET 'http://localhost:9200/bigdata/prod uct/_search?pretty' 根据条件进行查询 curl -XGET 'http://localhost:9200/bigdata/product/_search?q=name:hbas e&pretty'
- CURL使用之ES更新&删除
ES更新 ES可以使用PUT或者POST对文档进行更新,如果指定ID的文档已经存在,则执行更新操作 注意:执行更新操 作的时候,ES首先将旧的文档标记为删除状态,然后添加新的文档,旧的文 档不会立即消失,但是你也无法访问, ES会继续添加更多数据的时候在后台清理已经标记为删 除状态的文档。 局部更新 可以添加新字段或者更新已经存在 字段(必须使用POST)
curl -XPOST http://localhost:9200/bigdata/product/1/_update -d '{"doc":{"name" : "apache- hadoop"}}'
普通删除,根据主键删除 curl -XDELETE http://localhost:9200/bigdata/product/3/ 说明:如果文档存在,es属性 found:true,successful:1,_version属性的值+1。 如果文档不存在,es属性found为false,但是版本值version依 然会+1,这个就是内部 管理的一部分,有点像svn版本号,它保证了我们在多个节点间的不同操作的顺序被正确标记 了。 注意:一个文档被删除之后,不会立即生效,他只是被标记为已删除。ES将会在你之后添加 更多索引的时候才 会在后台进行删除。
- CURL使用之ES批量操作-bulk
Bulk api可以帮助我们同时执行多个请求 格式: action:[index|create|update|delete] metadata:index,type,id request body:source(删除操作不需要) {action:{metadata}} {request body} {action:{metadata}} {request body} create和index的区别 如果数据存在,使用create操作失败,会提示文档已经存在,使用index则可以成功执 行。 使用文件的方式 vi reqeusts curl -XPOST/PUT http://localhost:9200/index/type/_bulk --data-binary @path 比如 curl -XPOST 'http://localhost:9200/bank/accout/_bulk?pretty' --data-binary "@data/accounts.json"
accounts数据说明.txt
银行客户账号信息文档,文档schema如下 { "account_number": 0, "balance": 16623, "firstname": "Bradshaw", "lastname": "Mckenzie", "age": 29, "gender": "F", "address": "244 Columbus Place", "employer": "Euron", "email": "[email protected]", "city": "Hobucken", "state": "CO" }
可以查看一下各个索引库信息 curl 'http://localhost:9200/_cat/indices?v'
Bulk请求可以在URL中声明/index /index/_type Bulk一次最大处理多少数据量 Bulk会把将要处理的数据载入内存 中,所以数据量是有限制的 最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你 的索引以及搜索的负载 一般建议是1000~5000个文档,如果你的文档很大,可以适当减少队列,大小建议是 5~15MB,默认不能超过100M,可以在es的配置文件中修改这个值 http.max_content_length:100mb
- CURL使用之ES版本控制
ES版本控制 普通关系型数据库使用的是(悲观并发控制(PCC)) 当我们在读取一个数据前先锁定这一行,然后确 保只有读取到数据的这个线程可以修改 这一行数据 ES使用的是(乐观并发控制(OCC)) ES不会阻止某一数据的访 问,然而,如果基础数据在我们读取和写入的间隔中发生了变 化,更新就会失败,这时候就由程序来决定如何处理 这个冲突。它可以重新读取新数据来进 行更新,又或者将这一情况直接反馈给用户。 ES如何实现版本控制(使用es内 部版本号)
1:首先得到需要修改的文档,获取版本(version)
curl -XGET http://localhost:9200/bigdata/product/1
2 、
curl -XPUT http://localhost:9200/bigdata/product/1?version=1 -d '{"name":"hadoop","version":3}'
curl -XPOST http://localhost:9200/bigdata/product/1/update?version=3 -d '{"doc":{"name":"apache hadoop","latest_version": 2.6}}'(部分更新)
3、如果传递的版本号和待更新的文档的版本 号不一致,则会更新失败 ES如何实现版本控制(使用外部版本号) 如果你的数据库已经存在了版本号,或者是可以代 表版本的时间戳。这时就可以在es的查 询url后面添加version_type=external来使用这些号码。 注意:版本号码必须 要是大于0小于9223372036854775807(Java中long的最大正值)的 整数。
es在处理外部版本号的时候,它不再检查version version是否比 指定的数值小,如果小,则请求成功。 example:
curl -XPUT 'http://localhost:9200/bigdata/product/20?version =10&version_type=external' -d '{"name": "flink"}'
注意:此处url前后的引号不能省略,否则执行的时候会报错