- 大数据搜索与日志挖掘及可视化方案:ELK Stack:Elasticsearch、Logstash、Kibana (第2版)
- 高凯
- 1880字
- 2021-03-26 16:53:48
2.6 对文档的其他操作
除索引文档外,Elasticsearch也提供多种途径对文档进行获取信息、增、删、改、更新等相关操作。
2.6.1 获取指定的文档信息
可以通过GET方法来获取指定文档的详细信息,代码段2.21演示了查看索引weibo下类型文件名为wb且ID号为2的记录信息的方法,注意这里的HTTP方式是GET。
//代码段2.21: 获取指定文档文档信息
curl -XGET 'http://localhost: 9200/weibo/wb/2'
返回结果如下,包括在_source段中的内容就是文档中的详细内容(含各字段及其内容)。
{ "_index": "weibo", //索引名 "_type": "wb", //类型名 "_ID": "2", //ID号 "_version": 1, //版本号 "found": true, "_source": {"user": "LiMing", //详细信息 "post_date": "2014-10-15T14:12:12", "message": "Hello Tom" } }
除了上面的方法外,还可设置想要显示或屏蔽的结果。代码段2.22演示了关闭_source过滤器后的效果(注: 语句中的问号“?”表示其后是参数;pretty表示返回的结果中显示缩进以方便阅读)。执行上该语句后,在输出的结果中将不再带有source内容。
//代码段2.22: source过滤器
curl -XGET 'http://localhost:9200/weibo/wb/2?pretty&_source=false'
在下面的代码段2.23中,演示了如何只显示特定字段的方法(此例只显示fields为user的内容):
//代码段2.23: 显示特定字段的方法
curl -XGET 'http://localhost:9200/weibo/wb/2?pretty&fields=user'
针对上述语句的返回结果将只带有user 这个字段,如下所示:
{ "_index": "weibo", "_type": "wb", "_ID": "2", "_version": 1, "found": true, "fields": { "user": [ "LiMing" ] } }
2.6.2 删除文档中的信息
可以使用DELETE方法来删除文档中的相应信息。执行代码段2.24中的语句,会删除weibo索引中类型文件为wb且ID号为2的信息。
//代码段2.24: 删除指定的文档信息
curl -XDELETE 'http://localhost:9200/weibo/wb/2'
针对上述语句的返回值如下,表明删除成功:
{ "found": true, "_index": "weibo", "_type": "wb", "_ID": "2", "_version": 2 }
2.6.3 数据更新
如果需要对索引文档中的类型或其中的文档进行更新,需要用Elasticsearch提供的UPDATE API来实现。它的处理过程是先取出文档,运行指定的脚本,之后更新文档。下面的代码段2.25是在索引weibo中类型文件名为wb中增加ID为3的文档信息(给定了4个field,即user、post_date、message、like,这里的like字段表示针对此条微博的点赞的数量)。
//代码段2.25: 直接向索引文件中指定的ID中录入信息
curl-XPUT 'http://localhost:9200/weibo/wb/3'//直接指定ID号,这里的HTTP方法是PUT
{
"user": "LiMing",
"post_date": "2014-10-15T14:12:12",
"message": "Hello Tim",
"like": 3
}
可以通过使用Update API将上述这个文档中的like字段数值增加到4,实现方法如代码段2.26所示。注意这里的ctx._source.表示本文档的内容,ctx._source.like表示文档中某个具体的字段(这里是指like字段),而params是拟使用的新参数值。
//代码段2.26: 通过_update方式更新数据
curl-XPOST http://localhost:9200/weibo/wb/3/_update
//请注意这里的_update,HTTP方法是POST
{
"script": "ctx._source.like +=count"
"params": {
"count": 4
}
}
针对上面的例子,执行完上述语句后的索引数据如图2.6所示。注意字段中的like字段值已经由原先是3变为7。
图2.6 更新like字段后的索引数据
:上面的代码中,“ctx._source.”表示document内容,ctx._source.like表示该document中具体的fields是like字段;params表示为变量赋值为4。图2.6中的结果可以通过语句curl XPUT GET http://localhost:9200/weibo/wb/3命令得到。
上述语句是针对数值型数据的增、删、改操作。类似地,也可以完成对字符型数据的更新。代码段2.27录入了ID号为5的针对索引文件为weibo的类型文件名为wb的部分微博数据字段(user、post_data、message、tags)。
//代码段2.27: 直接向指定的ID中录入信息
curl-XPOST http://localhost:9200/weibo/wb/5 //注意这里使用的HTTP方法是POST
{
"user": "LiMing",
"post_date": "2014-10-15T14:12:12",
"message": "Hello Lily",
"tags": [
"Hello"
]
}
代码段2.28的作用是修改了上述语句执行结果中的tag信息并增加了新的内容(即在tag中增加了新的内容)。修改后的文档信息如图2.7所示(可通过curl XGET http://localhost:9200/weibo/wb/5命令得到结果)。
//代码段2.28: 通过_update方式更新信息
curl-XPOST http://localhost:9200/weibo/wb/5/_update //注意这里的POST方法
{
"script": "ctx._source.tags+=tag",
"params": {
"tag": "Today is a nice day!"
}
}
图2.7 更新tag后的索引数据
由于Elasticsearch处理的文档是非结构化的信息,因此可能与关系型数据库不同,文档中各记录的字段有可能不一样。利用_update,不仅可以像上述那样更新数据,还可以修改文档结构(如只在某一ID的记录上增加新的字段)。代码段2.29在指定的文档中增加新的字段,而这个新的字段的名字是name_of_new_field,其值是new_field,注意这里对引号需转义处理。
//代码段2.29: 通过update方式修改文档结构并增加新的字段
curl-XPOST http://localhost:9200/weibo/wb/5/_update
{
"script": "ctx._source.name_of_new_field=\"new_field\""
}
代码段2.30表示在使用_update参数时,如果该记录(即指定的ID号,此例中是7)不存在,则通过参数体中的upsert创建这个文档,并且加入新的字段(其名为counter,其值为1);如果有该记录(即指定的ID号,例子中是7),就把指定字段like的值增加4(在代码中的params中表明拟增加的偏移量)。
//代码段2.30: 通过update方式修改document结构
curl-XPOST http://localhost:9200/weibo/wb/7/_update
{
"script": "ctx._source.like+=count",
"params": {
"count": 4
},
"upsert": {
"counter": 1
}
}
2.6.4 基于POST方式批量获取文档
Elasticsearch支持一次操作多条记录。代码段2.31可返回ID号为5和7的记录信息,注意语句中的_mget参数的使用。
//代码段2.31: 基于POST方式批量获取文档
curl-XPOST http://localhost:9200/weibo/wb/_mget?
{
"docs": [
{
"_index": "weibo",
"_type": "wb",
"_ID": "5"
},
{
"_index": "weibo",
"_type": "wb",
"_ID": "7"
}
]
}
针对代码段2.31的返回结果如图2.8所示。
图2.8 基于POST方式批量获取文档数据
在代码中也可使用_source过滤器。代码段2.32只获取其中的一个文档信息。
//代码段2.32: 使用_source过滤器获取文档
curl-XPOST 'localhost:9200/_mget?pretty' -d '{
"docs": [
{ "_index": "weibo",
"_type": "wb",
"_ID": "3",
"_source": false
}
]
}'
针对上述语句的返回值如下:
{ "docs": [ { "_index": "weibo", "_type": "wb", "_ID": "3", "_version": 1, "found": true } ] }
2.6.5 删除部分文档
可以通过联合使用_query方法和DELETE API,将命中的文档中的部分或全部内容删除。代码段2.33检索到用户名为LiMing的文档,之后通过DELETE方法将其删除。
//代码段2.33: 删除文档LiMing
curl -XDELETE 'http://localhost:9200/weibo/wb/_query?q=user:LiMing'