二、 PUT 和POST用法
put : 注重修改
post: 注重新增
PUT是幂等方法,POST不是。所以PUT用于更新、POST用于新增比较合适。
PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。
POST操作不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。
还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
创建索引库
curl -XPUT 'http://TEST:9200/index_name'
插入索引
[chb@TEST bin]$ curl -XPOST http://TEST:9200/chb/employee/1 -d '{
> "first_name" : "John",
> "last_name" : "Smith",
> "age" : 25,
> "about" : "I love to go rock climbing",
> "interests": [ "sports", "music" ]
> }'
{ "_index":"chb",
"_type":"employee",
"_id":"1",
"_shards":{"total":2,"successful":1,"failed":0},
"created":true}
[chb@TEST bin]$
2.1、 创建索引注意事项
2.1.1、索引库名称必须要全部小写
2.1.2、 如果没有明确指定索引数据的ID,那么es会自动生成一个随机的ID,需要使用POST 参数
curl -XPOST http://TEST:9200/chb/emp/ -d '{"first_name" : "John"}'
2.1.3、如果想要确定我们创建的都是全新的内容
- 1、使用自增ID
- 2、在url后面添加参数 :?op_type=create
- 3、使用rest方式, 在url后面添加"_create"
[chb@TEST bin]$ curl -XPUT http://TEST:9200/chb/emp/2?op_type=create -d '{"name":"zs","age":25}'
{"_index":"chb",
"_type":"emp",
"_id":"2",
"_version":1,
"_shards":{"total":2,"successful":1,"failed":0},"created":true}
[chb@TEST bin]$
[chb@TEST bin]$ curl -XPUT http://TEST:9200/chb/emp/2?op_type=create -d '{"name":"zs","age":25}'
## 再次执行,出现失败
document_already_exists_exception
rest 方式
curl -XPUT "dn2:9200/test1/student/_create" -d '{"id":"004", "name":"xw1", "age":"221"}'
注意: 如果成功创建了新的文档,Elasticsearch将会返回常见的元数据以及 201 Created 的 HTTP 反馈码。而如果存在同名文件,Elasticsearch将会返回一个 409 Conflict 的 HTTP反馈码
三、GET查询索引
3.1、根据员工id查询 , 添加?pretty格式化
[chb@TEST bin]$ curl 'http://TEST:9200/chb/employee/1?pretty'
{
"_index" : "chb",
"_type" : "employee",
"_id" : "1",
"found" : false
}
3.2、 curl后添加-i 参数,这样你就能得到反馈头文件
[chb@TEST bin]$ curl -i 'http://TEST:9200/chb/emp/2?pretty'
## 头信息
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 148
{
"_index" : "chb",
"_type" : "emp",
"_id" : "2",
"_version" : 1,
"found" : true,
"_source" : {
"name" : "zs",
"age" : 25
}
}
3.3、检索文档中的一部分,如果只需要显示指定字段
###_source=xx 指定所要查询的部分字段
curl 'http://TEST:9200/chb/emp/2?_source=name,age'
3.4、如果只需要source的数据
[root@dn2 ~]# curl "dn2:9200/test1/student/2/_source?pretty"
{"id":"002", "name":"wx", "age":"26"}
3.5、查询所有
curl "dn2:9200/test1/student/_search?pretty"
3.6、你可以在返回的 hits 中发现我们录入的文档。搜索会默认返回最前的 10个数值。
3.7、根据条件进行查询
curl -XGET 'http://TEST:9200/chb/emp/_search?q=last_name:Smith'
例: curl -XGET "dn2:9200/test1/student/_search?q=name=chb"
四、 DSL
Domain Specific Language 领域特定语言
curl -XGET "dn2:9200/test1/student/_search?pretty" -d '{"query": {"match": {"name": "chb"}}}'
4.1、MGET
- 使用mget API获取多个文档
curl -XGET -i "dn2:9200/_mget?pretty"
-d '{
"docs": [
{"_index":"test1", "_type":"student", "_id":"1"},
{"_index":"test1", "_type":"student","_id":"2"}
]
}'
- 如果你需要的文档在同一个_index或者同一个_type中,你就可以在URL中指定一个默认的/_index或者/_index/_type
curl -XGET -i "dn2:9200/test1/student/_mget?pretty"
-d '{
"docs": [
{"_id":"1"},
{"_type":"teacher", "_id":"2"}
]
}'
- 如果所有的文档拥有相同的_index 以及 _type,直接在请求中添加ids的数组即可
curl -XGET -i "dn2:9200/test1/student/_mget?pretty"
-d '{
"ids": ["1", "2"]
}'
- 注意:如果请求的某一个文档不存在,不会影响其他文档的获取结果。HTTP返回状态码依然是200,这是因为mget这个请求本身已经成功完成。要确定独立的文档是否被成功找到,需要检查found标识。
4.2、检查文档是否存在
如果只想检查一下文档是否存在,你可以使用HEAD来替代GET方法,这样就只会返回HTTP头文件
[root@dn2 ~]# curl -i -XHEAD "dn2:9200/test1/student/1?pretty"
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
[root@dn2 ~]# curl -i -XHEAD "dn2:9200/test1/student/11111111?pretty"
HTTP/1.1 404 Not Found ####
Content-Type: text/plain; charset=UTF-8
Content-Length: 0
4.3 更新
4.3.1、ES可以使用PUT或者POST对文档进行更新,如果指定ID的文档已经存在,则执行更新操作
注意:执行更新操作的时候
- ES首先将旧的文档标记为删除状态
- 然后添加新的文档
- 旧的文档不会立即消失,但是你也无法访问
- ES会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档
4.3.2、局部更新,可以添加新字段或者更新已有字段(必须使用POST)
curl -XPOST "http://dn2:9200/test1/student/1/_update" -d '{"doc": {"city":"beijing"}}'
4.4、删除
如果文档存在,es会返回200 ok的状态码,found属性值为true,_version属性的值+1
[root@dn2 ~]# curl -XDELETE "http://dn2:9200/test1/student/2"
{"found":true,"_index":"test1","_type":"student","_id":"2","_version":2}
如果文档不存在,es会返回404 Not Found的状态码,found属性值为false,但是_version属性的值依然会+1,这个就是内部管理的一部分,它保证了我们在多个节点间的不同操作的顺序都被正确标记了
[root@dn2 ~]# curl -XDELETE "http://dn2:9200/test1/student/1"
{"found":false,"_index":"test1","_type":"student","_id":"1","_version":1}
注意:删除一个文档也不会立即生效,它只是被标记成已删除(和更新类似)。ES将会在你之后添加更多索引的时候才会在后台进行删除内容的清理。
4.4.1、通过查询API删除指定索引库下指定类型下的数据
curl -XDELETE -i "http://dn2:9200/test1/student/_query?q=name:wx1"