ElasticSearch restful实操

引言:

1. RESTful介绍:RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。RESTful 的核心思想就是,客户端发出的数据操作指令都是"动词 + 宾语"的结构。比如,GET /articles这个命令,GET是动词,/articles是宾语。     参考:阮一峰的网络日志:http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html

REST基本操作:

GET :获取对象的当前状态          PUT :改变对象的状态           POST :创建对象              DELETE :删除对象            HEAD :获取头信息

2. curl命令:简单的认为是可以在命令行下访问url的一个工具。 curl可以利用URL语法在命令行实现常见的 get/post请求。

  Curl的使用
    ? -X 指定http请求的方法GET POST PUT DELETE

    ? -d 指定要传递的参数

1. CURL命令创建索引库

控制台执行命令:

  curl -XPUT ‘http://localhost:9200/test01‘           (创建了名为 ‘test01’的索引库)。

  curl -H "Content-Type: application/json" -XPOST http://localhost:9200/test01/user/1 -d ‘{"name" : "jack","age" : 28}‘      (有ID,自己添加的)

  curl -H "Content-Type: application/json" -XPOST http://localhost:9200/test01/user/ -d ‘{"name" : "john"}‘                          (无id,系统会自动添加id)

命令解释:-H "Content-Type: application/json" -XPOST 针对es高版本的,老版本可以不用写。创建时使用 put post 都可以,但二者还是有区别的。

PUT和POST的用法区别 :

  PUT是幂等方法,而POST并不是。所以PUT用于更新操作,POST用于新增操作比较合适。

  所谓幂等是指不管进行多少次操作, 其结果都一样。PUT,DELETE操作是幂等的 ,POST操作不是幂等的,比如常见的POST重复加载问题:当我们 多次发出同样的POST请求后,其结果是创建出了若干的资源。

  还有一点需要注意的就是,创建操作可以使用POST,也可以使用 PUT,区别在于POST是作用在一个集合资源之上的(/articles), 而PUT操作是作用在一个具体资源之上(/articles/123)。

  比如说 很多资源使用数据库自增主键作为标识信息,而创建的资源的标识 信息到底是什么只能由服务端提供,这个时候就必须使用POST。

创建索引库注意事项 :

    1. 索引库名称必须要全部小写,不能以下划线开头,也不能包含逗号 。

    2. 如果没有明确指定索引数据的ID,那么es会自动生成一 个随机的ID,需要使用POST参数。

执行结果:head插件中显示结果:

 

2. 查询索引GET  

在url后面加上一个pretty则会对返回结果进行格式化。

  查询整个索引库:curl -XGET ‘http://localhost:9200/test/_search?pretty‘ 
      查询某一个type:curl -XGET ‘http://localhost:9200/test/user/_search?pretty‘ 
      查询具体的一条记录:curl -XGET ‘http://localhost:9200/test/user/1?pretty‘
      查询一条索引文档中的具体的字段:curl -XGET ‘http://localhost:9200/test/user/1?_source=name&pretty‘
            如果要查询多个字段,使用","进行隔开。eg. 
            curl -XGET ‘http://localhost:9200/test/user/1?_source=name,age&pretty‘
      获取source所有数据 
            curl -XGET ‘http://localhost:9200/test/user/1?_source&pretty ‘
      根据条件进行查询 
            curl -XGET ‘http://localhost:9200/test/user/_search?q=name:john&pretty‘

MGET查询:   mget API获取多个文档.

  curl -H "Content-Type: application/json" -XGET http://localhost:9200/test/user/_mget?pretty -d ‘{"ids":["1","2"]}‘

  ? 如果所有的文档拥有相同的_index 以及 _type,直接在请求中添加 ids的数组即可。

  curl -H "Content-Type: application/json" -XGET http://localhost:9200/test/user/_mget?pretty -d ‘{"docs":[{"_id":1},{"_id":2}]}‘

HEAD的使用: 如果只想检查一下文档是否存在,你可以使用HEAD来替代GET方法,这样就只会返回HTTP头文件。

  

  curl -i -XHEAD http://localhost:9200/test/user/1

        文档存在返回结果:HTTP/1.1 200 OK                   文档不存在返回:  HTTP/1.1 404 Not Found

3. ES更新操作

  ES可以使用PUT或者POST对文档进行更新,如果指定ID的文档已经存在,则执行更新操作

注意:执行更新操作的时候,ES首先将旧的文档标记为删除状态,然后添加新的文档,旧的文 档不会立即消失,但是你也无法访问,ES在你添加更多数据的时候,会在后台清理已经标记为删除状态的文档。

  局部更新,可以添加新字段或者更新已有

  字段(必须使用POST)

    curl -H "Content-Type: application/json" -XPOST http://localhost:9200/test/user/1/_update -d ‘{"doc":{"name":"baby","age":27}}‘

    查看已经更新后的数据: curl -XGET http://localhost:9200/test/user/1?pretty

4. ES删除操作

    curl -XDELETE http://master:9200/test/user/1

    curl -XGET http://master:9200/test/user/1

    如果文档存在,result属性值为deleted,_version属 性的值+1。如果文档不存在,result属性值为not_found,但是_version属性的值依然会+1。

  这个就是内部管理的一部分,它保证了我们在多个节 点间的不同操作的顺序都被正确标记了

    注意:删除一个文档也不会立即生效,它只是被标记成已删除。Elasticsearch将会在你之后添加 更多索引的时候才会在后台进行删除内容的清理。

5. 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则可以 成功执行。

使用文件的方式
新建一个requests文件
vi requests
{"index":{"_index":"test","_type":"user","_id":"6"}}
{"name":"mayun","age":51}

{"update":{"_index":"test","_type":"user","_id":"6"}}
{"doc":{"age":52}}

从上面可以看出,先使用index创建一条索引,然后更新这条索引,操作 了两次,version版本号变成了2.
执行批量操作
curl -H "Content-Type: application/json" -XPOST http://localhost:9200/_bulk --
data-binary @requests;

6.ES版本控制

  ? 普通关系型数据库使用的是(悲观并发控制(PCC)) 。当我们在修改一个数据前先锁定这一行,然后确保只有读取到数据的这个线程可以修改这一行数据.
  ? ES使用的是(乐观并发控制(OCC)) 。ES不会阻止某一数据的访问,然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可以重新读取新数据来进行更新,又或者将这一情况直接反馈给用户。

  ? ES如何实现版本控制(使用es内部版本号)
  ? 首先得到需要修改的文档,获取版本(_version)号

    curl -XGET http://localhost:9200/test/user/2

  ? 在执行更新操作的时候把版本号传过去
    curl -H "Content-Type: application/json" -XPUT

    http://localhost:9200/test/user/2?version=1 -d ‘{"name":"john","age":29}‘
curl -H "Content-Type: application/json" -XPOST

    http://localhost:9200/test/user/2/_update?version=2 -d
‘{"doc":{"age":30}}‘
  ? 如果传递的版本号和待更新的文档的版本号不一致,则会更新失败

原文地址:https://www.cnblogs.com/gshao/p/11010642.html

时间: 06-12

ElasticSearch restful实操的相关文章

实操UNITY3D接入91SDK安卓版

原地址:http://bbs.18183.com/thread-149758-1-1.html 本文内容为创建UNITY3D接入91SDK的DEMO的具体操作过程.本人水平有限,UNITY3D与Android如何交互的技术请大家参看雨松的博客.我的开发环境: MAC系统, ECLIPSE, UNITY4.0开发过程:1.准备要UNITY为交互Android自备的CLASS.JAR文件.   我的操作过程是:应用程序->UNTITY文件夹->UNITY->右键:显示包内容->CONT

做一次真正落地的亚马逊和独立站实操分享

当我敲了这几个大字的时候,我自己有点战战兢兢.为什么这么说呢?因为我自己还有很多需要提升的地方,我经常在群里嘚瑟,每次的分享确实是有很多欠缺,不怎么在群里活动的高手对我的分享肯定嗤之以鼻.虽然我觉得自己能力不足,但是我喜欢分享,就像咋们知无不言域名取的一样--知无不言,我喜欢把自己知道的讲给大家听. 那么,可能有些人对我这番话报以赞赏的态度.诚然,每个人都是一个独立的个体,没有必要更没有义务去分享自己所知道的,包括我也是,但是我尽量地去分享我关注亚马逊和独立站推广的实操和心得给大家方向.毕竟别人

DIV+CSS实操五:经管系网页内容模块内容添加(二)

继续接着DIV+CSS实操系列的博文添加代码:DIV+CSS实操一:经管系网页总体模块布局,DIV+CSS实操二: 经管系网页添加导航栏和友情链接栏,DIV+CSS实操三:经管系网页内容模块添加标题栏和版权信息模块和 DIV+CSS实操四:经管系网页内容模块内容添加(一).我们还是添加内容版块的内容,这一次是中间部分和右半部 分.由于中间的图片无缝滚动需要JS实现,我们后续加上. HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr

DIV+CSS实操三:经管系网页内容模块添加标题栏和版权信息模块

我们继续接着DIV+CSS实操一:经管系网页总体模块布局和DIV+CSS实操二:经管系网页添加导航栏和友情链接 栏这个系列的博文做经管系网页.这一次我们所要做的就是给内容版块添加标题栏,还有就是给制作信息版块添加链 接.这一篇博文基本就是做这些了,记着和前两篇博文比较效果. 还是老套路,写HTML代码时,一定要注意闭合标签,一定要注意代码的整齐承担和完整性,先来HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional

POSIX in Windows实操:Gentoo-prefix/interix

引子:无论是MingW还是Cygwin,包括最近冒起的MSYS2,都存在各种奇怪之处,一言蔽之,就是离不开Windows但又对POSIX心痒难搔.Gentoo prefix让你实实在在地操练POSIX,又不失Windows的优雅. 什么是Gentoo prefix? Gentoo是一种GNU/Linux发行版,就像Ubuntu是一种GNU/Linux发行版一样.Gentoo的特点就是好,真的好.其中的原理在于,Gentoo是基于POSIX标准的源代码发行版,而实现POSIX标准的二进制通常千奇百

Python实操二

实操一: 1.用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb name=['alex','wupeiqi','yuanhao'] name=['alex','wupeiqi','yuanhao'] m = map(lambda name:name+"_SB",name) print(list(m)) ------------输出结果------------------ ['alex_SB', 'wupeiqi_SB', 'yuanhao_SB'] 2.用map

打造网络营销利器-第1篇-TDK设置实操-网站优化进阶

网络营销如何做,才能从网络挖掘出大量的新业务?互联网时代你还停留于没业务就扩充销售队伍的思想,你就OUT了! 本系列文章将用通俗的语言介绍网站运营大牛们的惯用手法,网站SEO并没有你们想象那么难!重点是了解并坚持去做! 上一篇文章<中小企业网站优化技巧-1-网站的TDK>介绍了网站的TDK是什么(标题.描述.关键词),那么本文,将以具体产品为例介绍下TDK的实际操作. 首先,登录进网站系统后台,从左边菜单栏找到产品管理==>添加产品,点击打开添加产品的页面: 然后第一步,选择您产品对应的

2017年微信商战兵法最新最全最实操

2017年第1期<微领袖商战兵法>(2天1夜) 助你攻克5大难题 · 快速逆袭商场 · 远超竞争对手       我们分析了上百家企业的共性问题,根据辅导亿万级品牌和企业的微营销实战经验,浓缩出一套解决方案!帮你立刻解开困惑,成功启动微电商!不仅如此,还教你打造属于自己的会销系统.销讲流程,利用微渠道的优势,打造线上线下,一对多的招商.销售模式! 3大版块 · 打通 操盘 / 营销 / 管控 一切问题 ● 如何利用微渠道策略快速打开销售通路?● 传统销售团队如何1个月内利用微信业绩翻倍?● 如

PHP连接MySQL的八个步骤【实操】

我们为大家将数据库连接整理成了最重要的8个步骤,我戏称它为:"数据库连接天龙八步". 这八个步骤如下,并且将每一步使用的函数都做了说明: 第一步:  连接数据库服务器 类型 说明 函数 mysqli_connect 功能 连接到mysql数据库服务器 参数1 主机 参数2 数据库服务器登陆名 参数3 密码 参数4 数据库的名称 参数5 数据库服务器端口不填默认3306 若参数4,数据库名称在此步已填并择,不需要执行第三步. 第二步:  判断错误 类型 说明 函数 mysqli_errn

微商从0加到5000好友实操方法.rar

点击进入高速下载通道