REST 简介-定义

  REST (REpresentation State Transfer)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

  Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。

  在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。

REST 简介-资源

REST 简介-基本操作

  1)GET 获取对象的当前状态

  2)PUT 改变对象的状态

  3)POST 创建对象

  4)DELETE 删除对象

  5)HEAD 获取头信息

REST 简介-资源

 ES 内置的REST接口

ElasticSearch-CURL命令

简单认为是可以在命令行下访问url的一个工具

curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用curl可以简单实现常见的get/post请求。

 Curl的使用

  1)-X 指定http请求的方法GET POST PUT DELETE

  2)-d 指定要传递的参数

 ElasticSearch-CURL命令-建立索引库

curl -XPUT 'http://master:9200/djt/'

PUT/POST都可以

示例:

[hadoop@masternode elasticsearch-2.4.]$ curl -XPOST http://masternode:9200/zimo/user/1 -d '{"name" : "john", "age" : "28"}'
{"_index":"zimo","_type":"user","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"created":true}

输入网址:http://192.168.86.135:9200/_plugin/head/ 可以看到我们创建的zimo库成功了。

接下来再看一下创建的数据:

  如图所示,数据也成功创建了。

    ElasticSearch-CURL命令-PUT与POST对比

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

   2)PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。

   3)POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。

   4)还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。

 ElasticSearch-CURL命令-创建索引注意事项

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

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

curl -XPOST http://master:9200/zimo/user/ -d '{"name" : "john"}'

 创建全新内容的两种方式:

  1)使用自增ID(post)

  2)在url后面添加参数(get)

[hadoop@masternode elasticsearch-2.4.]$ curl -XPUT http://masternode:9200/zimo/user/2?op_type=create -d '{"name" : "john", "age" : 28}'
{"_index":"zimo","_type":"user","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"created":true}
[hadoop@masternode elasticsearch-2.4.]$ curl -XGET http://masternode:9200/zimo/user/1
或者
{"_index":"zimo","_type":"user","_id":"","_version":,"found":true,"_source":{"name" : "john", "age" : }}

 ElasticSearch-CURL命令-查询索引GET

  1.根据员工id查询

[hadoop@masternode elasticsearch-2.4.]$ curl -XGET http://masternode:9200/zimo/user/1
{"_index":"zimo","_type":"user","_id":"","_version":,"found":true,"_source":{"name" : "john", "age" : }}
在任意的查询字符串中添加pretty参数,es可以得到易于识别的json结果。 [hadoop@masternode elasticsearch-2.4.]$ curl -XGET http://masternode:9200/zimo/user/1?pretty
{
"_index" : "zimo",
"_type" : "user",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "john",
"age" :
}
}

  2.检索文档中的一部分,如果只需要显示指定字段

[hadoop@masternode elasticsearch-2.4.]$ curl -XGET 'http://masternode:9200/zimo/user/1?_source=name&pretty'
{
"_index" : "zimo",
"_type" : "user",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "john"
}
}

  3.查询指定索引库指定类型所有数据

[hadoop@masternode elasticsearch-2.4.]$ curl -XGET http://masternode:9200/zimo/user/_search
{"took":,"timed_out":false,"_shards":{"total":,"successful":,"failed":},"hits":{"total":,"max_score":1.0,"hits":[{"_index":"zimo","_type":"user","_id":"AWVlstKrgUMcKLYQxfRR","_score":1.0,"_source":{"name" : "john"}},{"_index":"zimo","_type":"user","_id":"","_score":1.0,"_source":{"name" : "john", "age" : }},{"_index":"zimo","_type":"user","_id":"","_score":1.0,"_source":{"name" : "john", "age" : }}]}}

  4.根据条件进行查询

[hadoop@masternode elasticsearch-2.4.]$ curl -XGET http://masternode:9200/zimo/user/_search?q=age:28
{"took":,"timed_out":false,"_shards":{"total":,"successful":,"failed":},"hits":{"total":,"max_score":0.30685282,"hits":[{"_index":"zimo","_type":"user","_id":"","_score":0.30685282,"_source":{"name" : "john", "age" : }},{"_index":"zimo","_type":"user","_id":"","_score":0.30685282,"_source":{"name" : "john", "age" : }}]}}

 ElasticSearch-CURL命令-DSL查询

  Domain Specific Language领域特定语言

  新添加一个文档

[hadoop@masternode elasticsearch-2.4.]$ curl -XPUT http://masternode:9200/zimo/user/3/_create -d '{"name" : "lily", "age" : 18}'
{"_index":"zimo","_type":"user","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"created":true}

[hadoop@masternode elasticsearch-2.4.0]$ curl -XGET http://masternode:9200/zimo/user/_search -d '{"query":{"match":{"name":"lily"}}}'  (查询)
{"took":,"timed_out":false,"_shards":{"total":,"successful":,"failed":},"hits":{"total":,"max_score":0.30685282,"hits":[{"_index":"zimo","_type":"user","_id":"","_score":0.30685282,"_source":{"name" : "lily", "age" : }}]}}

 ElasticSearch-CURL命令-MGET查询

  1.使用mget API获取多个文档

  先新建一个库

[hadoop@masternode elasticsearch-2.4.]$ curl -XPUT 'http://masternode:9200/zimo2'
{"acknowledged":true}

[hadoop@masternode elasticsearch-2.4.]$ curl -XPOST http://masternode:9200/zimo2/user/1 -d '{"name" : "lucy", "age" : 20}'
{"_index":"zimo2","_type":"user","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"created":true}

[hadoop@masternode elasticsearch-2.4.]$ curl -XGET http://masternode:9200/_mget?pretty -d '{"docs":[{"_index":"zimo","_type":"user","_id":2,"_source":"name"},{"_index":"zimo2","_type":"user","_id":1}]}'
{
"docs" : [ {
"_index" : "zimo",
"_type" : "user",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "john"
}
}, {
"_index" : "zimo2",
"_type" : "user",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "lucy",
"age" :
}

  2.如果需要的文档在同一个_index或者同一个_type中,你就可以在URL中指定一个默认的/_index或者/_index/_type

[hadoop@masternode elasticsearch-2.4.]$ curl -XGET http://masternode:9200/zimo/user/_mget?pretty -d '{"docs":[{"_id":1},{"_id":2}]}'
{
"docs" : [ {
"_index" : "zimo",
"_type" : "user",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "john",
"age" :
}
}, {
"_index" : "zimo",
"_type" : "user",
"_id" : "",
"_version" : ,
"found" : true,
"_source" : {
"name" : "john",
"age" :
}
} ]
}

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

curl -XGET http://masternode:9200/zimo/user/_mget?pretty -d '{"ids":["1","2"]}'

  结果同上。

 ElasticSearch-CURL命令-HEAD使用

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

[hadoop@masternode elasticsearch-2.4.]$ curl -i -XHEAD http://masternode:9200/zimo/user/1
HTTP/1.1 OK
Content-Type: text/plain; charset=UTF-
Content-Length:

 ElasticSearch-CURL命令-更新

  ES可以使用PUT或者POST对文档进行更新(全部更新),如果指定ID的文档已经存在,则执行更新操作。执行更新操作的时候要注意以下细节:

  1)ES首先将就得文档标记为删除状态

  2)然后添加新的文档

  3)就得文档不会立即消失,但是你也无法访问

  4)ES会在你继续添加更多数据的时候再后台清理已经标记问删除状态的文档、

  局部更新:可以添加新字段或者更新已有字段(必须使用POST)

[hadoop@masternode elasticsearch-2.4.0]$ curl -XPOST http://masternode:9200/zimo/user/1/_update -d '{"doc":{"name":"john","age":30}}'
{"_index":"zimo","_type":"user","_id":"1","_version":5,"_shards":{"total":2,"successful":2,"failed":0}}

 ElasticSearch-CURL命令-删除

[hadoop@masternode elasticsearch-2.4.]$ curl -XDELETE http://masternode:9200/zimo/user/1
{"found":true,"_index":"zimo","_type":"user","_id":"","_version":,"_shards":{"total":,"successful":,"failed":}}

  如果文档存在,found属性值为true,_version属性值+1;

  如果文档不存在,found属性值为false,但是_version属性值依然+1,这个就是内部管理的一部分,它保证了我们在多个节点间的不同操作的顺序都被 正确标记了;

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

 ElasticSearch-CURL命令-bulk批量操作

  bulk API可以帮助我们同时执行多个请求。

  格式:

action: index/create/update/delete

  metadata:_index/_type/_id

  request body:_source(删除操作不需要)

      (action:{metadata})

      {request body       }

      (action:{metadata})

      {request body       }

  create和ndex的区别:如果数据存在,使用create操作失败会提示文档已经存在,使用index则可以成功执行。

//新建一个requests文件
[hadoop@masternode elasticsearch-2.4.]$ vi requests
{"index":{"_index":"zimo","_type":"user","_id":""}}
{"name":"mayun","age":}
{"update":{"_index":"zimo","_type":"user","_id":""}}
{"doc":{"age":}}
[hadoop@masternode elasticsearch-2.4.]$ ls
bin config lib LICENSE.txt modules NOTICE.txt plugins README.textile requests
//执行批量操作
[hadoop@masternode elasticsearch-2.4.]$ curl -XPOST http://masternode:9200/_bulk --data-binary @requests;
{"took":,"errors":false,"items":[{"index":{"_index":"zimo","_type":"user","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"status":}},{"update":{"_index":"zimo","_type":"user","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"status":}}]}

  bulk请求可以在URL中声明/_indexhuozhe /_-index/_type.

    bulk一次最大可以处理多少数据量:

  1)bulk会把将要处理的数据载入内存中,所以数据量是有限的;

  2)最佳的数据量不是一个确定的数值,它取决于你的硬件,你的文档大小以及复杂性,你的索引以及搜索的负载;

  3)一般建议是1000-5000个文档,如果你的文档很大,可以适当减少队列,大小建议是5-15M,默认不能超过100M,可以在ES的配置文件中修改这个值http.max_content_length:100mb;

  4)https://www.elastic.co/guide/en/elasticsearch/reference/2.4/moudles-http.html。

 ElasticSearch-CURL命令-版本控制

  普通关系型数据库使用的是PCC(悲观并发控制):当我们在修改一个数据前先锁定这一行,然后确保只有读取到的这个线程可以修改这一行数据。

  ES使用的是OCC(乐观并发控制):ES不会阻止某一数据的访问。然而,如果基础数据在我们读取和写入的间隔中发生了变化,更新就会失败,这时候就由程序来决定如何处理这个冲突。它可以重新读取数据来进行更新,又或者将这一情况最直接反馈给用户。

  ES如何实行版本控制?(使用ES内部版本号)

  1)首先需要修改的文档,获取版本号(_version)

[hadoop@masternode elasticsearch-2.4.]$ curl –XGET http://masternode:9200/zimo/user/2
{"_index":"zimo","_type":"user","_id":"","_version":1,"found":true,"_source":{"name" : "john", "age" : }}

  2)在执行更新操作的时候把版本号传过去

[hadoop@masternode elasticsearch-2.4.]$ curl http://masternode:9200/zimo/user/2?version=1 -d '{"name":"john1","age":29}'
{"_index":"zimo","_type":"user","_id":"","_version":,"_shards":{"total":,"successful":,"failed":},"created":false}

  该操作可以重复执行,每执行一次版本号都会+1。

  3)如果传递的版本号和待更新的版本号不一致,更新操作将会失败。

以上就是博主为大家介绍的这一板块的主要内容,这都是博主自己的学习过程,希望能给大家带来一定的指导作用,有用的还望大家点个支持,如果对你没用也望包涵,有错误烦请指出。如有期待可关注博主以第一时间获取更新哦,谢谢!

ElasticSearch 全文检索— ElasticSearch 基本操作的更多相关文章

  1. ElasticSearch 全文检索— ElasticSearch概述

    ElasticSearch 产生背景 1.海量数据组合条件查询 2.毫秒级或者秒级返回数据 Lucene 定义 lucene是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一 ...

  2. ElasticSearch 全文检索— ElasticSearch 核心概念

    ElasticSearch核心概念-Cluster 1)代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的.es的一个概念就是去中心化,字 ...

  3. ElasticSearch 全文检索— ElasticSearch 安装部署

    ElasticSearch 规划-集群规划 ElasticSearch 规划-集群规划 ElasticSearch 规划-用户规划 ElasticSearch 规划-目录规划 ElasticSearc ...

  4. Elasticsearch全文检索工具入门

    Elasticsearch全文检索工具入门: 1.下载对应系统版本的文件 elasticsearch-2.4.0.zip 1.1运行elasticsearch-2.4.0\elasticsearch- ...

  5. 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践

    1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...

  6. 《从Lucene到Elasticsearch全文检索实战》的P184页

    curl -XPOST "http://localhost:9200/_bulk?pretty" --data-binary @books.json 这句话在书中是以crul的命令 ...

  7. 全文检索-Elasticsearch (三) DSL

    DSL:elasticsearch查询语言elasticsearch对json 的语法有严格的要求,每个json串不能换行,同时一个json串和一个json串之间,必须有一个换行 DSL(介绍查询语言 ...

  8. SpringBoot日记——ElasticSearch全文检索

    看到标题的那一串英文,对于新手来说一定比较陌生,而说起检索,应该都知道吧. 这个ElasticSearch目前我们的首选,他主要有可以提供快速的存储.搜索.分析海量数据的作用.他是一个分布式搜索服务, ...

  9. Elasticsearch全文检索学习

    ElasticSearch官方网址:https://www.elastic.co ElasticSearch官方网址(中文):https://www.elastic.co/cn/ Elasticsea ...

随机推荐

  1. IAR常用快捷键及技巧

    1.复制和粘贴几行的部分代码 需求:有时候我们需要复制几行代码的后半部分,不需要复制前半部分.方法:按住Alt键,再用鼠标拖动就可以复制和粘贴后半部分 [END/2015-09-23] 2.复制一行 ...

  2. java代码JFrame练习

    总结: package com.da; import java.awt.Button; import java.awt.Color; import java.awt.FlowLayout; impor ...

  3. 游戏中的 2D 可见性

    转自:http://www.gameres.com/469173.html 拖动圆点转一圈,看看玩家都能看到些什么: 这个算法也能计算出给定光源所照亮的区域.对每条光线,我们可以构建出被照亮区域的光线 ...

  4. JVM类加载(2)—连接

    2.连接 连接就是将已经加载到内存中的类的二进制数据合并到Java虚拟机的运行时环境中去,加载阶段尚未完成,连接阶段可能已经开始.连接阶段包含验证.准备.解析过程. 2.1.验证 验证.class文件 ...

  5. electron将网站打包成桌面应用

    需求同 NW.js将网站打包成桌面应用 1. 从github上克隆electron示例项目 git clone https://github.com/electron/electron-quick-s ...

  6. SpringMVC 利用@ResponseBody注解返回Json时,出现406 not acceptable 错误的解决方法。

    1 在RequestMapping中加入produces属性如: @RequestMap(value="/path",produces="application/json ...

  7. [xjtu21]wmq的午餐 计数问题

    http://oj.xjtuacm.com/problem/21/ 对13进行分析,每种价格出现的次数: $(C_m^1 + C_m^2 + ... + C_m^m)(C_{n - m}^0 + C_ ...

  8. 使用Openssl编译svn并安装

    我的操作系统是CentOS 6.8.公司的svn服务器安装在windows系统中,并且使用 VisualSVN 对外提供https服务. 在centos 6.8上如果我使用yum 安装svn,那么根本 ...

  9. 4.Windows应急响应:勒索病毒

    0x00 前言 勒索病毒,是一种新型电脑病毒,主要以邮件.程序木马.网页挂马的形式进行传播.该病毒性质恶劣. 危害极大,一旦感染将给用户带来无法估量的损失.这种病毒利用各种加密算法对文件进行加密,被感 ...

  10. linux下mysql远程链接

    前言:我的系统是ubuntu,默认不支持mysql远程链接.接下来的步骤改变这点. 1,首先取消mysql本机绑定 编辑/etc/mysql/my.cnf 将”bind-address = 127.0 ...