大家好,我是烤鸭:

今天分享的是官网6.x    单一文档(Single document APIs)APIs。

本文这是部分翻译,如果想看全部的,还是建议阅读官方api。链接:

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

1.    索引(index)API

添加或更新:(json格式)

PUT twitter/_doc/1
{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch"
}

结果:

{"_shards" : {"total" : 2,"failed" : 0,"successful" : 2},"_index" : "twitter","_type" : "_doc","_id" : "1","_version" : 1,"_seq_no" : 0,"_primary_term" : 1,"result" : "created"
}

_shards :  表示接收数据的碎片。

total : 碎片总量(执行当前操作的)。

failed :    操作失败的碎片数量。只要有一个成功,就认为索引是操作成功的。

当索引操作成功返回时,副本碎片可能不会全部启动(默认情况下,仅需要主元素,但此行为可以更改)。在这种情况下,总数将等于基于副本数量设置的总数碎片,并且成功将等于碎片开始数量(主加副本)。如果没有失败,失败将是0。

版本编辑

每个索引文档都有一个版本号。关联的版本号作为对索引API请求的响应的一部分返回。在指定版本参数时,索引API可选地允许乐观并发控制。这将控制将要执行的操作的文档版本。版本控制用例的一个很好的例子是执行事务读然后更新。从最初读取的文档中指定一个版本,确保其间没有发生任何更改(当为了更新而阅读时,建议将preference 设置为_primary)。例如:

PUT twitter/_doc/1?version=2
{"message" : "elasticsearch now has versioning support, double cool!"
}

操作类型编辑

索引操作还接受一个op_type类型,它可以用来强制create操作,允许“put-if-absent”的行为。当使用create 时,如果索引中已经存在该ID的文档,则索引操作将失败。

下面是使用op_type参数的示例:

PUT twitter/_doc/1?op_type=create
{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch"
}

另一种写法:

PUT twitter/_doc/1/_create
{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch"
}

自动生成ID

可以在不指定ID的情况下执行索引操作。在这种情况下,ID将自动生成。此外,op_type 将被自动设置为create。下面是一个例子(注意使用POST而不是PUT):

POST twitter/_doc/
{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch"
}

结果:

{"_shards" : {"total" : 2,"failed" : 0,"successful" : 2},"_index" : "twitter","_type" : "_doc","_id" : "W0tpsmIBdwcYyG50zbta","_version" : 1,"_seq_no" : 0,"_primary_term" : 1,"result": "created"
}

路由

默认情况下,碎片放置或routing是通过使用文件ID值的散列来控制的。对于更明确的控制,可以使用路由参数在每个操作基础上直接指定馈送到路由器使用的散列函数的值。例如:

POST twitter/_doc?routing=kimchy
{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch"
}

在上面的示例中,基于提供的“kimchy”路由参数,将“_doc”文档指引到碎片。

当设置显式映射时,可选地使用_routing 字段来指示索引操作以从文档本身中提取路由值。这样(使用路由的方式)确实使得额外的文档解析传递的成本非常低。如果定义了_routing 映射并设置required,则如果没有提供或提取路由值,则索引操作将失败。

分布式

索引操作根据其路由指向主碎片(参见上面的路由部分),并在包含该碎片的实际节点上执行。在主碎片完成操作之后,如果需要,则将更新分发给可应用的副本。

等待active碎片

为了提高对系统的写入的性能,索引操作可以被配置为,在进行操作之前,等待一定数量的活动碎片副本。如果所需的active碎片副本数不可用,则写入操作必须等待并重试,直到所需碎片已开始或超时。默认情况下,写入操作在执行之前只等待主碎片变成active(i.e. wait_for_active_shards=1)。可以通过设置index.write.wait_for_active_shards来动态地在索引设置中修改此默认值。为了改变每种操作的行为,可以使用wait_for_active_shards请求参数。

有效值是全部或任何正整数,与索引中每个碎片的配置拷贝总数(number_of_replicas+1)。指定大于碎片副本数量的负值或数字将引发错误。 (翻译注: wait_for_active_shards 这个值不能是负的,也不能大于副本数量。)

例如,假设我们有一个三个节点的集群,A、B和C,并且我们创建一个索引index,其中副本的数量设置为3个(导致4个碎片副本,比节点多一个副本)。如果我们尝试索引操作,默认情况下,操作将只确保每个碎片的主副本在执行之前可用。这意味着,即使B和C挂掉了,并且A托管主碎片副本,索引操作仍然只继续执行,虽然只有一个数据副本。如果wait_for_active_shards 被设置在请求到3(并且所有3个节点都是可用的),那么索引在操作之前将需要3个active 碎片副本,需要满足的要求是,由于在集群中有3个活动节点,每个都持有碎片的副本。但是,如果我们将wait_for_active_shards碎片设置为all(或4,一个意思),则索引操作不会继续进行,因为在索引中的每个碎片的(副本),所有4个副本不都是active。除非在集群中出现新节点来管理碎片的第四副本,否则操作将超时。
重要的是要注意,写入操作有时不会把数据写到足够数量的碎片副本,这种设置大大降低了这种可能,但因为该检查发生在写入操作开始之前,也不能完全消除可能。一旦写入操作正在进行,复制仍可能在任何碎片的其他副本上失败,但在主副本上仍然成功。写入操作响应的_shards部分表示了复制 成功/失败 的碎片副本的数量。

{"_shards" : {"total" : 2,"failed" : 0,"successful" : 2}
}

NOOP    更新
当使用索引API更新文档时,即使文档没有更改,也总是创建文档的新版本。如果这是不可接受的,使用 _update API时,将detect_noop设置为true。这个参数在索引API上是不可用的,因为索引API没有获取旧的源,并且无法将它与新的源进行比较。

当NOOP 更新不能使用时,没有一个固定的原因。这是很多因素的组合,比如你的数据源发送多个更新是真的noops的频率,es每秒在碎片上运行多少个查询结果用于update数据。

超时

当执行索引操作时,分配给执行索引操作的主碎片可能不可用。一些原因可能是主碎片目前正在从网关恢复或进行重新定位。默认情况下,索引操作将等待主碎片1分钟。timeout 参数可用于显式指定它等待多长时间。下面是将其设置为5分钟的示例:

PUT twitter/_doc/1?timeout=5m
{"user" : "kimchy","post_date" : "2009-11-15T14:12:12","message" : "trying out Elasticsearch"
}

2.    获取(GET)API

  get请求获取json数据:
        

GET twitter/_doc/0

结果:

{"_index" : "twitter","_type" : "_doc","_id" : "0","_version" : 1,"found": true,"_source" : {"user" : "kimchy","date" : "2009-11-15T14:12:12","likes": 0,"message" : "trying out Elasticsearch"}
}

上述结果包括了我们希望检索的文档的_index_type_id和 _version,包括文档的实际_source(如果在响应中found字段标示)。

API还允许使用HEAD检查文档的存在,例如:

HEAD twitter/_doc/0

实时
默认情况下,get API是实时的,并且不受索引刷新率的影响(当数据将成为搜索可见时)。如果文档已被更新,但尚未刷新,则get API将在本地发出刷新调用以使文档可见。这也会使其他文档在可见性上发生变化。为了禁用实时特性,可以将realtime参数设置为false。

源过滤器

默认情况下,get操作返回_source字段的内容,除非您已经使用stored_fields 参数,或者如果禁用了_source  字段。可以通过使用_source 参数来关闭_source检索:

GET twitter/_doc/0?_source=false

如果您只需要完整的_source内容中的一个或两个字段,则可以使用_source_include&_source_exclude 参数来包含或过滤掉所需的部分。这对于在大型文档中检索部分内容,是非常有效的,因为可以节省网络开销。两个参数都采用逗号分隔的字段或通配符表达式列表。例如:

GET twitter/_doc/0?_source_include=*.id&_source_exclude=entities

如果只想指定包含,则可以使用更短的符号:

GET twitter/_doc/0?_source=*.id,retweeted

存储字段
get操作允许指定一个存储字段的集合,这些字段将通过stored_fields 参数返回。如果所请求的字段未被存储,它们将被忽略。例如,考虑下面的映射:

PUT twitter
{"mappings": {"_doc": {"properties": {"counter": {"type": "integer","store": false},"tags": {"type": "keyword","store": true}}}}
}

现在新增一个文档:

PUT twitter/_doc/1
{"counter" : 1,"tags" : ["red"]
}

尝试去检索刚才生成的:

GET twitter/_doc/1?stored_fields=tags,counter

结果:

{"_index": "twitter","_type": "_doc","_id": "1","_version": 1,"found": true,"fields": {"tags": ["red"]}
}

从文档本身获取的字段值总是作为数组返回。由于counter字段未被存储,所以GET请求在试图获取stored_fields时忽略它。

还可以检索元数据字段,如_routing 字段:

PUT twitter/_doc/2?routing=user1
{"counter" : 1,"tags" : ["white"]
}

或者:

GET twitter/_doc/2?routing=user1&stored_fields=tags,counter

结果:

{"_index": "twitter","_type": "_doc","_id": "2","_version": 1,"_routing": "user1","found": true,"fields": {"tags": ["white"]}
}

此外,只有leaf字段可以通过stored_field 选项返回。所以不能返回对象字段,这样的请求就会失败。

直接获取_source

使用/{index}/{type}/{id}/_source端点来获取文档的_source字段,而不必在其周围添加任何内容。例如:

GET twitter/_doc/1/_source

还可以使用相同的source filtering参数来控制将返回的_source 的哪些部分:

GET twitter/_doc/1/_source?_source_include=*.id&_source_exclude=entities'

注意,还存在一个用于_source 端点的HEAD 变量,以有效地测试文档源的存在。如果在映射中被禁用,则现有文档将不具有源。

HEAD twitter/_doc/1/_source

路由

当使用索引控制路由时,为了获得文档,还应提供路由值。例如:

GET twitter/_doc/2?routing=user1

以上将得到id是2的twitter,但会基于用户路由。注意,发出一个没有正确路由的get请求导致文档不你能获取。

preference (偏好)

哪个碎片副本来执行GET请求的preference。默认情况下,操作是在碎片副本之间随机进行的。
preference可以设置为:
_primary
操作将只在主碎片上执行。
_local
如果可能的话,操作将更倾向于在本地分配的碎片上执行。
Custom (string) value(自定义字符串值)
自定义值将用于保证相同的碎片将用于相同的自定义值。这可以在不同刷新状态下击中不同碎片时

使用 "jumping values" 。简单的示例值类似于Web session ID或用户名。

刷新
refresh 参数可以设置为true ,以便在GET操作之前刷新相关碎片并使其可搜索。将其设置为true 应经过仔细思考和验证,这不会导致系统上的高负载(而减慢索引)。

分布式

get操作被hash成一个特定的碎片ID。它被重定向到该碎片ID中的一个副本,并返回结果。在该碎片ID组中副本就是的主碎片及其副本。这意味着我们将拥有更多的副本,我们将有更大的范围。

版本支持

只有当当前版本等于指定的版本时,才可以使用version 参数检索文档。这种行为对于所有版本类型都是相同的,除了版本类型为FORCE ,FORCE 一直在检索文档。请注意,FORCE版本类型被弃用。
在内部,es 已经标记旧文档被删除,并添加了一个全新的文档。旧版本的文档不会立即消失,尽管你不能访问它。当继续给更多数据添加索引时,es会在后台清除已删除的文档。

更多关于elasticsearch 6.x内容:

1.   elasticsearch 6.x 部署 windows入门(一) spingboot连接

2.   elasticsearch 6.x linux部署(二) kibana x-pack 安装

3.   elasticsearch 6.x (三) linux 集群多节点部署

elasticsearch 6.x (四) 单一文档 API 介绍和使用 index和get API相关推荐

  1. elasticsearch 6.x (五) 单一文档 API 介绍和使用 update和delete API

    大家好,我是烤鸭: 今天分享的是官网6.x    单一文档(Single document APIs)APIs. 本文这是部分翻译,如果想看全部的,还是建议阅读官方api.链接: https://ww ...

  2. elasticsearch基础1——索引、文档

    用于复习快速回顾. 目录 1.初识弹性搜索elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK弹性栈 1.1.3.elasticsearch和 ...

  3. Logstash+Elasticsearch+kibana搭建日志平台文档(xjh20160527重庆公司亲测可用)

    Logstash+Elasticsearch+kibana搭建日志平台文档 v1.0_xjh  20160527 http://wenku.baidu.com/link?url=_HaXh4neqWm ...

  4. 接口对接文档规范2023年最新版(Restful API风格)

    接口对接文档 服务共享 1.设计模式 使用Restful API风格, Restful API的优势是具备更好的易用性,让异构系统更容易集成,且开发执行效率比较高,面向资源要求也比较高. 2.设计约束 ...

  5. 【信息系统项目管理师】第十四章 文档与配置管理思维导图

    [信息系统项目管理师]第十四章 文档与配置管理思维导图 文档管理和配置管理是第十四章总两大知识板块. 文档管理 信息系统中的文档按质量分级可以分为1-4级分别是最低限度文档,内部文档,工作文档,正式文 ...

  6. Elasticsearch基本操作:索引、文档、搜索

    1.索引 在 Elasticsearch 中开始为数据建立索引之前要做的第一步操作是创建--我们的数据主要容器.这里的索引类似于 SQL 中的数据库概念.它是类型(相当于 SQL 中的表)和文档(相当 ...

  7. ElasticSearch查询篇索引映射文档数据准备

    elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...

  8. Tsung MQTT协议简介及MQTT xml文档配置介绍

    MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...

  9. 产品设计(1) – 产品需求文档(PRD)介绍

    产品设计是一个由抽象的概念到具体形象化的处理过程,通过文字或图像等方式将我们规划的产品需求展现出来.它将产品的某种目的或需求转换为一个具体的物理或工具的过程,把一种计划.规划设想.问题解决的方法,通过 ...

最新文章

  1. Machine Learning for Encrypted Malware Traffic Classification
  2. WebX5 button tabs的bind-text属性设置
  3. Javascript 原型和继承(Prototypes and Inheritance)
  4. VMware Linux下拖拽补丁vmtools的安装和卸载
  5. 提问征集:对话VLC首席开发者Jean-Baptiste Kempf
  6. mybatis比hibernate处理速度快的原因
  7. mysql启动时报错:Starting MySQL ERROR The server quit without updating PID file
  8. [转载] 你真的会用 Java 中的三目运算符吗
  9. Java笔记-解决Cause: java.sql.SQLException: 试图在只读事务中修改数据(达梦数据库)
  10. javascript-----日历控件
  11. 一个简单的鼠标钩子程序
  12. ABtest用于推荐系统性能衡量
  13. 如何使用project制定项目计划?(附详细步骤截图)
  14. javascript实现日历功能
  15. 视频加水印怎么加?简单的方法
  16. Linux26期 6月21日
  17. 【熵与特征提取】从近似熵,到样本熵,到模糊熵,再到排列熵,究竟实现了什么?(第一篇)——近似熵及其MATLAB实现
  18. 第六届360前端星计划_深入CSS
  19. Gido推出电商快递服务,从中国到越南只需三天
  20. 分式化简结果要求_分式化简的结果有什么要求?

热门文章

  1. [html] 编写html时,你有没有用过Emmet插件呢?说说它的优点及规则有哪些?
  2. [html] websocket和http2有什么区别?http2能取代websocket吗?为什么?
  3. [html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看
  4. [vue] vue的属性名称与method的方法名称一样时会发生什么问题?
  5. [css] 写出你知道的CSS水平和垂直居中的方法
  6. [css] position跟margin collapse这些特性相互叠加后会怎么样?
  7. 前端学习(2623):Vuex初步识别
  8. 工作57:element格式化内容
  9. 前端学习(2055)vuejs的认识和特点介绍
  10. 前端学习(1253):Vue前后端交互