Elasticsearch学习笔记(四)

Elasticsearch的文档简单的来说就是一条记录,但是除了我们存储的数据外,还额外的包含了一些其他的内容。
我们可以针对文档进行增加(PUT,POST),删除(DELETE),修改(PUT,POST)和查询(GET)。

文档必要元数据

我们先取出上一篇中银行客户的一条记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"_index": "bank",
"_type": "account",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"account_number": 1,
"balance": 39225,
"firstname": "Amber",
"lastname": "Duke",
"age": 32,
"gender": "M",
"address": "880 Holmes Lane",
"employer": "Pyrami",
"email": "amberduke@pyrami.com",
"city": "Brogan",
"state": "IL"
}
}

一条文档必须包含_index_type_id三个元数据。_index表示记录所在索引,即文档存储在哪个数据库中;_type表示记录所在的类型,即文档存储在哪张表中;_id是文档的唯一标识符。

_index命名规则:

  • 必须全小写
  • 不能以下划线开头
  • 不能包含逗号

_type命名规则:

  • 可以大写或小写
  • 不能包含下划线
  • 不能包含逗号

_id是一个字符串,你可以自己定义或者让Elasticsearch帮你自动生成。

POST和PUT的区别

之前我们增加或更新数据的时候都会指定一个我们自己的_id,那么在增加文档的时候,我们想让Elasticsearch自动帮我们生成_id怎么办,做个试验吧。

首先是PUT:

1
2
3
4
5
curl -XPUT "http://localhost:9200/bank/account" -d'
{
"age": 33,
"Test": 123
}'

1
No handler found for uri [/bank/account] and method [PUT]

报错了,说明我们用PUT的时候必须要指定_id

然后是POST:

1
2
3
4
5
curl -XPOST "http://localhost:9200/bank/account" -d'
{
"age": 33,
"Test": 123
}'

1
2
3
4
5
6
7
8
9
10
11
12
{
"_index": "bank",
"_type": "account",
"_id": "AVQeRDS3IyUOBcVavUA0",
"_version": 1,
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"created": true
}

创建成功,返回的结果中我们看到了Elasticsearch自动帮我们的文档生成的_id

在创建一条新文档的时候,用POST几乎没有什么问题,但是如果我们真的想使用我们自定义的_id,这时候就需要注意一点,万一_id存在的话会覆盖原来的数据。Elasticsearch提供了下面的办法,你以指定_id的形式创建文档,如果_id不存在,就创建文档,否则返回错误信息。

1
2
3
4
5
6
7
8
9
10
11
12
# 下面两种方法中的PUT换成POST也可
curl -XPUT "http://localhost:9200/bank/account/10000/_create" -d'
{
"age": 33,
"Test": 123
}'
# 与上述操作等价
curl -XPUT "http://localhost:9200/bank/account/10001?op_type=create" -d'
{
"age": 33,
"Test": 123
}'

成功:

1
2
3
4
5
6
7
8
9
10
11
12
{
"_index": "bank",
"_type": "account",
"_id": "10001",
"_version": 1,
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"created": true
}

失败:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"error": {
"root_cause": [
{
"type": "document_already_exists_exception",
"reason": "[account][10001]: document already exists",
"shard": "3",
"index": "bank"
}
],
"type": "document_already_exists_exception",
"reason": "[account][10001]: document already exists",
"shard": "3",
"index": "bank"
},
"status": 409
}