Elasticsearch 简明教程
Elasticsearch - Document APIs
Elasticsearch 提供了单文档 API 和多文档 API,其中 API 调用分别针对单个文档和多个文档。
Index API
当针对特定映射向相应索引发出请求时,它有助于将 JSON 文档添加到索引中或在其中更新 JSON 文档。例如,以下请求会将 JSON 对象添加到索引学校和学校映射中 -
PUT schools/_doc/5
{
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",
"_type" : "_doc",
"_id" : "5",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1
}
Automatic Index Creation
当提出向特定索引添加 JSON 对象的请求且该索引不存在时,此 API 会自动创建该索引以及该特定 JSON 对象的基础映射。可以通过将 elasticsearch.yml 文件中存在的以下参数的值更改为 false 来禁用此功能。
action.auto_create_index:false
index.mapper.dynamic:false
您还可以限制自动创建索引,其中仅允许具有特定模式的索引名称,方法是更改以下参数的值 -
action.auto_create_index:+acc*,-bank*
Note - 此处 + 表示允许,- 表示不允许。
Versioning
Elasticsearch 还提供了版本控制工具。我们可以使用 version 查询参数来指定特定文档的版本。
PUT schools/_doc/5?version=7&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",
"_type" : "_doc",
"_id" : "5",
"_version" : 7,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
版本控制是一个实时过程,不会受到实时搜索操作的影响。
有两种最重要的版本控制类型 -
Operation Type
操作类型用于强制创建操作。这有助于避免覆盖现有文档。
PUT chapter/_doc/1?op_type=create
{
"Text":"this is chapter one"
}
运行以上代码时,我们得到以下结果:-
{
"_index" : "chapter",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
Automatic ID generation
当在索引操作中未指定 ID 时,Elasticsearch 会自动为此文档生成 id。
POST chapter/_doc/
{
"user" : "tpoint",
"post_date" : "2018-12-25T14:12:12",
"message" : "Elasticsearch Tutorial"
}
运行以上代码时,我们得到以下结果:-
{
"_index" : "chapter",
"_type" : "_doc",
"_id" : "PVghWGoB7LiDTeV6LSGu",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
Get API
API 通过对特定文档执行获取请求来帮助提取类型 JSON 对象。
pre class="prettyprint notranslate" > GET schools/_doc/5
运行以上代码时,我们得到以下结果:-
{
"_index" : "schools",
"_type" : "_doc",
"_id" : "5",
"_version" : 7,
"_seq_no" : 3,
"_primary_term" : 1,
"found" : true,
"_source" : {
"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"
}
}
-
此操作为实时操作,且不受索引的刷新速率的影响。
-
您还可以指定版本,然后 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"
}
}
您只需在 get 请求中添加 _source 部分,即可在结果中获取源代码部分。
GET schools/_doc/5?_source
运行以上代码时,我们得到以下结果:-
{
"_index" : "schools",
"_type" : "_doc",
"_id" : "5",
"_version" : 7,
"_seq_no" : 3,
"_primary_term" : 1,
"found" : true,
"_source" : {
"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"
}
}
在执行 get 操作之前,您还可以通过将 refresh 参数设置为 true 来刷新分片。
Delete API
您可以通过向 Elasticsearch 发送 HTTP DELETE 请求来删除特定索引、映射或文档。
DELETE schools/_doc/4
运行以上代码时,我们得到以下结果:-
{
"found":true, "_index":"schools", "_type":"school", "_id":"4", "_version":2,
"_shards":{"total":2, "successful":1, "failed":0}
}
可以指定文档的版本,以删除该特定版本。可以指定路由参数,以从特定用户删除文档,如果文档不属于该特定用户,则该操作将失败。在此操作中,您可以指定 refresh 和 timeout 选项,与 GET API 相同。
Update API
脚本用于执行此操作,版本控制用于确保在 get 和重新索引期间没有更新发生。例如,您可以使用脚本更新学校费用 −
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
}
您可以通过向更新的文档发送 get 请求检查更新。