一 文档
ES面向文档,并且使用JSON作为文档序列化格式,对于ES来说,文档特指根对象序列化成的JSON数据,以唯一ID标识并存储于ES中。
- 文档元数据
三个必须的元数据节点
1、_index 文档存储的地方
索引类似于关系数据库中的数据库,它是我们存储和索引关联数据的地方
2、_type 文档代表的对象的类
类似于关系型数据库中的表,每个类型都有自己的映射或者结构定义
3、_id 文档的唯一标识
与_index和_type组合可以在ES中唯一标识一个文档,可以自定义,也可以由ES自动生成
二 索引
1、使用自己的id
需要自己指定id,请求方式为PUT
示例:
请求 PUT 127.0.0.1:9200/{index}/{type}/{id} (这里取index为test,type 为test, id 为3)
参数:JSON数据
响应:
{
"_index": "test",
"_type": "test",
"_id": "3",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
可以看到响应中的_id与自己设置的一致
2、使用自增id
无需自己指定id,请求方式为POST
示例
请求 POST 127.0.0.1:9200/{index}/{type} (这里取index为test,type 为test)
参数:JSON数据
响应:
{
"_index": "test",
"_type": "test",
"_id": "WOTj8GYBuXRyDW5PpvRN",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
可以看到使用自增id,ES会随机生成一个uuid作为文档的id
三 获取文档
1、检索文档
想要从Elasticsearch中获取文档,我们使用同样的_index
、_type
、_id
,但是HTTP方法改为GET
示例:
GET 127.0.0.1:9200/test/test/4
响应
{
"_index": "test",
"_type": "test",
"_id": "4",
"_version": 2,
"found": true,
"_source": {
"hello": "world",
"author": "wuzhe"
}
}
响应中的_source 即我们放入的文档内容
found 表示文档存在
若检索一个不存在的文档,则响应为
{
"_index": "test",
"_type": "test",
"_id": "5",
"found": false
}
这时 found变成了false
2、检索部分文档
通常,GET
请求将返回文档的全部,存储在_source
参数中。但是可能你感兴趣的字段只是title
。请求个别字段可以使用_source
参数。多个字段可以使用逗号分隔:
示例
GET 127.0.0.1:9200/test/test/4?_source=hello
响应
{
"_index": "test",
"_type": "test",
"_id": "4",
"_version": 2,
"found": true,
"_source": {
"hello": "world"
}
}
这样就只能看到hello对应的内容了
3、检查文档是否存在
如果你想做的只是检查文档是否存在,对内容完全不感兴趣,可以使用HEAD
方法来代替GET
HEAD 127.0.0.1:9200/test/test/4
响应
若存在 状态码status为200
若不存在 状态码status为404
4、检索多个文档
如果想要查询多个文档,ES提供了一个mget
API可以将多次检索合并,避免了一次次检索的请求网络时间
mget
API参数是一个docs
数组,数组的每个节点定义一个文档的_index
、_type
、_id
元数据。如果你只想检索一个或几个确定的字段,也可以定义一个_source
参数:
示例 : POST 127.0.0.1:9200/_mget
请求参数:
{ "docs" : [ { "_index" : "test", "_type" : "test", "_id" : 3 }, { "_index" : "test", "_type" : "test", "_id" : 4, "_source": "hello" }, { "_index" : "test", "_type" : "test", "_id" : 5 } ] }
响应
{ "docs": [ { "_index": "test", "_type": "test", "_id": "3", "_version": 1, "found": true, "_source": { "first_name": "John", "last_name": "Smith", "age": 25, "about": "I love to go rock climbing", "interests": [ "sports", "music" ] } }, { "_index": "test", "_type": "test", "_id": "4", "_version": 2, "found": true, "_source": { "hello": "world" } }, { "_index": "test", "_type": "test", "_id": "5", "found": false } ] }
可以看到响应体也包含一个docs
数组,每个文档还包含一个响应,它们按照请求定义的顺序排列。每个这样的响应与单独使用get
request响应体相同。
可以看到第三个文档不存在,但这不影响第一第二个文档的检索,每个文档的检索和报告都是独立的。
如果你想检索的文档在同一个_index
中(甚至在同一个_type
中),你就可以在URL中定义一个默认的/_index
或者/_index/_type
。
你依旧可以在单独的请求中使用这些值:
POST /test/test/_mget
{
"docs" : [
{ "_id" : 2 },
{ "_type" : "newtest", "_id" : 1 }
]
}
事实上,如果所有文档具有相同_index
和_type
,你可以通过简单的ids
数组来代替完整的docs
数组:
POST /test/test/_mget
{
"ids" : [ "2", "1" ]
}