用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。
ElasticSearch文档的操作;
添加文档
新建一个索引 goboy-blog,如果添加文档索引不存在则会创建一个索引。
javascript
PUT goboy-blog/_doc/1
{
"title":"我的第一个文档",
"data":"2023-11-2",
"content":"用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。"
}
Elasticsearch文档索引的响应示例,包含了以下关键信息:
"_index"
: 这是文档所属的索引的名称,这里是"goboy-blog"。
"_type"
: 在Elasticsearch 7.x版本之后,通常为"_doc"
,表示默认文档类型。
"_id"
: 这是文档的唯一标识符,用于在索引中唯一标识文档。在这里,文档的ID是"1"。
"_version"
: 这是文档的版本号,表示文档的版本。在这里,文档的版本号是1。
"result"
: 这是文档索引操作的结果,这里是"created",表示文档已经成功创建。
"_shards"
: 这是关于文档索引操作的分片信息。
"total"
: 这是总分片数量,这里是2。
"successful"
: 这是成功索引的分片数量,这里是1。这表示在2个分片中的1个成功索引。
"failed"
: 这是失败的分片数量,这里是0。表示没有分片索引操作失败。
"_seq_no"
: 这是文档的序列号,用于跟踪文档的变化。
"_primary_term"
: 这是文档所在的主分片的主要期(primary term)。
这个响应表明文档成功地被索引到了"goboy-blog"索引中,索引操作是成功的,只有一个分片成功地完成了索引操作。索引操作通常用于将文档添加到Elasticsearch索引中,以便后续搜索和检索。
知识点!!!
- 使用PUT请求添加文档时必须携带文档id,否则会出错
- 使用POST请求添加文档可以不携带文档id,会自动创建一个文档id
javascript
POST goboy-blog/_doc
{
"title":"我的第二个文档",
"data":"2023-11-2",
"content":"用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。"
}
查找文档
javascript
GET goboy-blog/_doc/2
- 获取编号(ID)为2的文档:
Elasticsearch文档检索的响应示例,包含了以下关键信息:
"_index"
: 这是文档所属的索引的名称,这里是"goboy-blog"。
"_type"
: 在Elasticsearch 7.x版本之后,通常为"_doc"
,表示默认文档类型。
"_id"
: 这是文档的唯一标识符,用于在索引中唯一标识文档。在这里,文档的ID是"2"。
"found"
: 这是一个布尔值,表示是否找到了文档。在这里,值为false
,表示未找到ID为"2"的文档。
这个响应表明尝试检索ID为"2"的文档,但未找到该文档,因此found
字段的值为false
。文档检索操作通常用于从索引中检索文档,如果文档存在,则会返回文档的详细信息,如果文档不存在,则会返回found
字段为false
。
javascript
GET goboy-blog/_doc/1
查看索引中所有文档内容
javascript
GET goboy-blog/_search
判断文档是否存在
根据id判断指定文档是否存在
javascript
Head goboy-blog/_doc/1
javascript
Head goboy-blog/_doc/2
批量获取文档
- 获取goboy-blog索引中编号为1和2的文档
javascript
GET goboy-blog/_mget
{
"ids":["1","2"]
}
这里直接用POST请求批量查询比较好的。
javascript
POST goboy-blog/_mget
{
"ids":["1","2"]
}
文档更新
普通更新(根据id)
javascript
PUT goboy-blog/_doc/1
{
"title":"更新我的第一个文档"
}
文档更新一次,_version 就会加1;
更新某个字段的值会覆盖整个文档:
javascript
GET goboy-blog/_doc/1
通过查询发现,字段已经被覆盖
大多数时候我们只需要更新某一个字段的值,所以我们采取以下方式:
请求格式: POST {index}/_update/{id}
javascript
POST goboy-blog/_update/1
{
"script": {
"lang": "painless",
"source": "ctx._source.title=params.title",
"params": {
"title":"更新我的第一个文档"
}
}
}
查看
Elasticsearch的更新请求,它试图更新索引中的文档。让我来解释这个请求的各个部分:
POST goboy-blog/_update/2
: 这是HTTP请求,用于更新索引中的文档。以下是各个部分的解释:
goboy-blog
: 这是索引的名称,表示要对"goboy-blog"索引进行操作。
_update
: 这是Elasticsearch的更新操作,用于部分更新文档。
2
: 这是文档的唯一标识符(ID),表示要更新的文档的ID。在这里,文档的ID是"2"。
"script"
: 这是更新文档时使用的脚本。
"lang"
: 这是脚本语言,这里是"Painless",一种用于Elasticsearch的脚本语言。
"source"
: 这是脚本的源代码,指定了要执行的脚本逻辑。脚本的作用是将文档中的"title"字段更新为"我是一个标题"。
"params"
: 这是脚本参数,允许将参数传递给脚本。在这里,参数"title"被设置为"我是一个标题"。
这个请求的目的是将ID为"2"的文档中的"title"字段更新为"我是一个标题"。更新请求中的脚本部分使用Painless脚本语言来执行更新操作。请注意,这是一个示例请求,实际应用中需要根据具体需求和文档结构来编写更新请求。
添加字段
- 增加一个文档的字段tags并为其赋值
- 增加tags标签并为其赋值 java,js
javascript
PUT goboy-blog/_doc/2
{
"title":"我的第二个文档",
"data":"2023-11-2",
"content":"用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。"
}
javascript
POST goboy-blog/_update/2
{
"script": {
"lang": "painless",
"source": "ctx._source.tags=[\"java\",\"js\"]"
}
}
- 获取文档内容:
- 使用add方法为tags标签添加一个元素css
javascript
POST goboy-blog/_update/2
{
"script": {
"lang": "painless",
"source": "ctx._source.tags.add(\"css\")"
}
}
- 再次获取文档内容:
- 也可以使用一些复杂的 if-else逻辑
- 如果文档中的tags标签包含css内容,则删除此文档,否则什么都不做
javascript
POST goboy-blog/_update/2
{
"script": {
"lang": "painless",
"source": "if(ctx._source.tags.contains(\"css\")){ctx.op=\"delete\"}else{ctx.op=\"none\"}"
}
}
- 查询
查询更新
- 当前数据
通过条件查询找到文档,然后进行更新
例如:将title包含"更新"的文档的content修改为"非常非常的走心"。
- 文档内容:
javascript
POST goboy-blog/_update_by_query
{
"script": {
"source": "ctx._source.content=\"非常非常的走心\"",
"lang": "painless"
},
"query": {
"term": {
"title": "666"
}
}
}
- 更新结果:
Elasticsearch批量操作的响应示例,包含了有关操作执行的各种统计信息和指标。以下是响应中各个字段的解释:
"took"
: 表示操作花费的时间,这里是6毫秒。
"timed_out"
: 是一个布尔值,表示操作是否超时,这里是false
,表示操作未超时。
"total"
: 表示操作涉及的文档总数,这里是1,表示有1个文档被操作。
"updated"
: 表示已经更新的文档数量,这里是1,表示1个文档被更新。
"deleted"
: 表示已经删除的文档数量,这里是0,表示没有文档被删除。
"batches"
: 表示操作执行的批次数量,这里是1,表示有1个批次的操作。
"version_conflicts"
: 表示发生版本冲突的文档数量,这里是0,表示没有版本冲突。
"noops"
: 表示没有实际操作的文档数量,这里是0,表示所有操作都是有效的。
"retries"
: 包含了重试操作的信息,分为bulk
(批量操作)和search
(搜索操作)两种类型,这里都是0,表示没有重试操作。
"throttled_millis"
: 表示操作由于限流而被暂停的时间,这里是0毫秒,表示没有限流暂停。
"requests_per_second"
: 表示每秒执行的操作请求数,这里是-1.0,表示没有限制。
"throttled_until_millis"
: 表示限流操作将持续暂停的时间,这里是0毫秒,表示没有限流。
"failures"
: 包含了有关操作中发生的错误的详细信息,这里是一个空数组,表示没有错误。
这个响应表明执行的操作更新了1个文档,操作总数为1,没有发生错误或冲突。通常,这种情况表示操作成功,并且已经更新了指定文档。
删除文档
根据id删除
语法:DELETE {index}/_doc/{id}
删除一个id为 VF9xiosBWWxO5_dDHEpm 的文档
javascript
DELETE goboy-blog/_doc/VF9xiosBWWxO5_dDHEpm
如果在添加文档时指定了路由,则删除文档时也需要指定路由,否则删除失败。
查询删除
查询删除是 POST 请求。
语法:POST {index}/_delete_by_query
例如:删除 title 中包含 666 的文档:
javascript
POST goboy-blog/_delete_by_query
{
"query":{
"term":{
"title":"666"
}
}
}
删除某一个索引下的所有文档:
javascript
POST goboy-blog/_delete_by_query
{
"query":{
"match_all":{}
}
}
- 查询
批量操作
通过 API 可以执行批量索引、批量删除、批量更新等操作。
搞一个名为 goboy.json 的文件,内容如下:
javascript
{"index":{"_index":"goboy","_id":"123"}}
{"name":"Javaboy"}
{"update":{"_index":"goboy","_id":"123"}}
{"doc":{"name":"C++boy"}}
第一行:index 表示要执行一个索引操作(这个表示一个 action,其他的 action 还有 create,delete,update)。
- _index 定义了索引名称,这里表示要创建一个名为 goboy的索引;
- _id 表示新建文档的 id 为 123;
第二行是第一行操作的参数。
第三行的 update 则表示要更新。
第四行是第三行的参数。
注意!!!,结尾要空出一行。
goboy.json 文件创建成功后,放到服务器的某个目录下,执行请求命令,如下:
javascript
curl -XPOST "http://localhost:9200/goboy/_bulk" -H "content-type:application/json" --data-binary @/opt/goboy.json
执行完成后,就会创建一个名为 goboy的索引了,同时向该索引中添加一条记录,再修改该记录;