elasticsearch -- 文档操作
Elasticsearch提供了单文档API和多文档API,其中API调用分别针对单个文档和多个文档。
原文链接:https://www.cainiaojc.com/elasticsearch/elasticsearch-document-apis.html
增/添加数据
特性:
- 自动ID生成: 如果在索引操作中未指定ID,则Elasticsearch会自动为该文档生成ID。
- 版本控制(下面详解)
- 操作类型(下面详解)
当对具有特定映射的相应索引进行请求时,它有助于在索引中添加或更新JSON文档。
例如,以下请求会将JSON对象添加到索引学校和学校映射下
PUT schools/_doc/5 # JSON数据 { "name":"City School", "description":"ICSE", "street":"West End", "city":"Meerut", "state":"UP", "zip":"250002", "location":[28.9926174, 77.692485], "fees":3500, "tags":["fully computerized"], "rating":"4.5" }
结果:
{ "_index": "schools", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1 }
如图:
注意:
- 当请求将JSON对象添加到特定索引时,如果该索引不存在,则此API会自动创建该索引以及该特定JSON对象的基础映射。
- 可以通过将 elasticsearch.yml 文件中存在的以下参数的值更改为false来禁用此功能。如下:
action.auto_create_index:false index.mapper.dynamic:false
- 您还可以限制索引的自动创建,通过更改以下参数的值,只允许使用具有特定模式的索引名称
action.auto_create_index:+acc*,-bank*
注意:此处 + 表示允许,而 – 表示不允许。
版本控制
Elasticsearch还提供了版本控制工具。我们可以使用版本查询参数来指定特定文档的版本。
版本控制是一个实时过程,不受实时搜索操作的影响。这个主要是ES使用的乐观锁来保证数据安全,所有我们可以通过version来更新原数据,
PUT schools/_doc/2?version=2&version_type=external
{ "name":"Central School", "description":"CBSE Affiliation", "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115", "location":[31.8955385, 76.8380405], "fees":2200, "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3" }
返回:
{ "_index": "schools", "_id": "1", "_version": 2, "result": "updated", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 2, "_primary_term": 1 }
注意: _version :2 , result: update, 更新成功
有两种最重要的版本控制类型-
- 内部版本控制
内部版本控制是默认版本,从1开始,并随着每次更新(包括删除)而递增。
- 外部版本控制
当文档的版本控制存储在外部系统(如第三方版本控制系统)中时,将使用此功能。
要启用此功能,我们需要将version_type设置为external。
在这里,Elasticsearch将存储外部系统指定的版本号,并且不会自动对其进行递增。
操作类型
操作类型用于强制执行创建操作。这有助于避免覆盖现有文档。
PUT chapter/_doc/1?op_type=create { "Text":"this is chapter one" }
返回:
{ "_index": "schools", "_id": "3", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 3, "_primary_term": 1 }
如图:
获取操作
API通过对特定文档执行get请求来帮助提取类型JSON对象。
GET schools/_doc/3
示例:
注意:
-
此操作是实时的,不受索引刷新率的影响。
-
您还可以指定版本,然后Elasticsearch将仅获取该文档的版本。
-
您还可以在请求中指定_all,以便Elasticsearch可以按每种类型搜索该文档ID,它将返回第一个匹配的文档。
-
您还可以在特定文档的结果中指定所需的字段。
指定所需的字段
GET schools/_doc/5?_source_includes=name,fees
返回:
{ "_index" : "schools", "_type" : "_doc", "_id" : "5", "_version" : 7, "_seq_no" : 3, "_primary_term" : 1, "found" : true, "_source" : { "fees" : 2200, "name" : "Central School" } }
详解:
- _source 数据存放key
- _includes 为导入语句, 同C语言预处理指令
- name,fees为 字段下的key值
删除操作
发送HTTP DELETE请求来删除特定的索引,映射或文档。
DELETE schools/_doc/4
返回:
{ "_index": "schools", "_id": "1", "_version": 3, "result": "deleted", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 4, "_primary_term": 1 }
如图:
更新操作
脚本用于执行此操作,版本控制用于确保在获取和重新编制索引期间未发生任何更新。例如,您可以使用脚本更新学费-
POST schools/_update/4
{
"script" : {
"source": "ctx._source.name = params.sname",
"lang": "painless",
"params" : {
"sname" : "City Wise School"
}
}
}
返回:
{ "_index" : "schools", "_type" : "_doc", "_id" : "4", "_version" : 3, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 4, "_primary_term" : 2 }
您可以通过向更新的文档发送获取请求来检查更新。