• 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 指定要传递的参数

    3. ES 内置的REST接口

    URL

    说明

    /index/_search

    搜索指定索引下的数据

    /_aliases

    获取或者操作索引下的别名
    

    /index/

    查看指定索引下的详细信息
    

    /index/type/

    创建或者操作类型

    /index/mapping

    创建或者操作mapping

    /index/settings

    创建或者操作settings

    /index/_open

    打开指定索引

    /index/_close

    关闭指定索引

    /index/_refresh

    刷新索引(使新增加内容对搜索可见, 不保证数据被写入磁盘)

    /index/_flush

    刷新索引(会触发Lucene提交数据)

    4. ES vs关系型数据库

    关系型数据 库

    Database

    (数据库)

    Table

    (表)

    Row

    (行)

    Column

    (列)

    ElasticSear ch

    Index

    (索引库)

    Type

    (类型)

    Document

    (文档)

    Field

    (字段)

    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 '{"docs":[{"_id":1},{"_id":2}]}'  

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

      curl -H "Content-Type: application/json" -XGET http://localhost:9200/test/user/_mget?pretty -d '{"ids":["1","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}}'
       如果传递的版本号和待更新的文档的版本号不一致,则会更新失败

  • 相关阅读:
    javascript前端如何使用google-protobuf
    【Linux】Linux中常用操作命令
    MyEclipse 安装svn 插件步骤详情
    MultipartFile(文件的上传)--CommonsMultipartResolver
    oracle sql 获取本季度所有月份,上季度所有月份
    git与github安装、配置
    Java使用JaxWsDynamicClientFactory和HttpURLConnection两种方式调取webservice的接口
    三级联动
    Excel的两种导出入门方法(JAVA与JS)
    页面设置遮罩层
  • 原文地址:https://www.cnblogs.com/gshao/p/11010642.html
Copyright © 2020-2023  润新知