百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

ElasticSearch系列(二)基本数据操作(中)

toyiye 2024-06-21 11:57 10 浏览 0 评论


接前文【ElasticSearch系列(二):基本数据操作(上)

6.查找文档主体信息

上面查找到并返回的信息比较多,如果,仅仅想返回需要的_source部分,主体信息。

需要执行如下命令:GET ddz/_source/1

则返回信息如下:

{

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

7.自动文档 ID 生成

文档的ID可以视情况而指定具体值,也可以由ES自动生成,但是自动生成的话,需要使用POST,而不是 PUT。

例如:

POST my_ddz/_doc/

{

"uid":10001,

"nickname":"麦子",

"coin":3000,

"phone":13622445609,

"score":203

}

执行,返回如下:

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "GbfZw4YBGAbwf5pv8YVW",

"_version" : 1,

"result" : "created",

"_shards" : {

"total" : 2,

"successful" : 1,

"failed" : 0

},

"_seq_no" : 0,

"_primary_term" : 1

}

从上面可以看到,id会自动被分配。

注意:再次执行上面的脚本,则会再次执行插入成功,只是被分配了一个新的id。所以,此种情况下,需要特别注意数据的重复,是否超出预期。

假如,上述脚本共执行了五次,通过接口_search查看一下所有的数据的表现:

执行:GET my_ddz/_search

返回如下信息:

{

"took" : 624,

"timed_out" : false,

"_shards" : {

"total" : 1,

"successful" : 1,

"skipped" : 0,

"failed" : 0

},

"hits" : {

"total" : {

"value" : 5,

"relation" : "eq"

},

"max_score" : 1.0,

"hits" : [

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "GbfZw4YBGAbwf5pv8YVW",

"_score" : 1.0,

"_source" : {

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

},

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "Grfaw4YBGAbwf5pvjIWn",

"_score" : 1.0,

"_source" : {

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

},

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "G7faw4YBGAbwf5pvr4Wp",

"_score" : 1.0,

"_source" : {

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

},

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "HLfaw4YBGAbwf5pvtoUj",

"_score" : 1.0,

"_source" : {

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

},

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "Hbfpw4YBGAbwf5pvJIXt",

"_score" : 1.0,

"_source" : {

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

}

]

}

}

8.获取自动生成id的文档的_source的信息

对于,自动生成id的文档,如果也想获取_source的信息

执行如下脚本:GET my_ddz/_source/GbfZw4YBGAbwf5pv8YVW

返回信息如下:

{

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

注意:id 无需加 ” ”

9.获取_source的部分字段信息

如果仅仅想获取_source的部分字段,则执行如下脚本:

GET my_ddz/_source/GbfZw4YBGAbwf5pv8YVW?_source=nickname,coin

返回信息如下:

{

"nickname" : "麦子",

"coin" : 3000

}

GET my_ddz/_source/GbfZw4YBGAbwf5pv8YVW?_source=uid,coin

返回信息如下:

{

"uid" : 10001,

"coin" : 3000

}

10.获取多个文档的信息

如果想获取多个文档的信息,执行如下命令:

GET _mget

{

"docs": [

{

"_index": "my_ddz",

"_id": "GbfZw4YBGAbwf5pv8YVW"

},

{

"_index": "my_ddz",

"_id": "Hbfpw4YBGAbwf5pvJIXt"

}

]

}

或者:

GET my_ddz/_mget

{

"ids": [

"GbfZw4YBGAbwf5pv8YVW",

"Hbfpw4YBGAbwf5pvJIXt"

]

}

返回信息如下:

{

"docs" : [

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "GbfZw4YBGAbwf5pv8YVW",

"_version" : 1,

"_seq_no" : 0,

"_primary_term" : 1,

"found" : true,

"_source" : {

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

},

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "Hbfpw4YBGAbwf5pvJIXt",

"_version" : 1,

"_seq_no" : 4,

"_primary_term" : 1,

"found" : true,

"_source" : {

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

}

]

}

如果_id为数字,则可以使用引号,也可以不使用引号:

如下:

GET ddz/_mget

{

"ids": [

1, # 未使用引号

2

]

}

或者

GET ddz/_mget

{

"ids": [

"1", # 使用引号

"2"

]

}

11.获得多个文档的_source的部分字段信息

如果想获得多个文档的_source的部分字段信息,如下:

GET my_ddz/_mget/?_source=uid,coin

{

"ids":

[

"GbfZw4YBGAbwf5pv8YVW",

"Hbfpw4YBGAbwf5pvJIXt"

]

}

或者

GET _mget

{

"docs": [

{

"_index": "my_ddz",

"_id": "GbfZw4YBGAbwf5pv8YVW",

"_source": [

"uid",

"coin"

]

},

{

"_index": "my_ddz",

"_id": "Hbfpw4YBGAbwf5pvJIXt",

"_source": [

"uid",

"coin"

]

}

]

}

注意:上面的两个文档,可以返回不同的_source的字段信息:

例如:

GET _mget

{

"docs": [

{

"_index": "my_ddz",

"_id": "GbfZw4YBGAbwf5pv8YVW",

"_source": [

"uid",

"nickname",

"coin"

]

},

{

"_index": "my_ddz",

"_id": "Hbfpw4YBGAbwf5pvJIXt",

"_source": [

"uid",

"coin"

]

}

]

}

返回信息如下:

{

"docs" : [

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "GbfZw4YBGAbwf5pv8YVW",

"_version" : 1,

"_seq_no" : 0,

"_primary_term" : 1,

"found" : true,

"_source" : {

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000

}

},

{

"_index" : "my_ddz",

"_type" : "_doc",

"_id" : "Hbfpw4YBGAbwf5pvJIXt",

"_version" : 1,

"_seq_no" : 4,

"_primary_term" : 1,

"found" : true,

"_source" : {

"uid" : 10001,

"coin" : 3000

}

}

]

}

三.修改文档

修改一个文档时,通常会使用 PUT 来进行操作,并且,需要指定一个特定的 id 。

在修改之前,我们先查看一下原来的文档内容是什么:

GET ddz/_source/1

返回如下:

{

"uid" : 10001,

"nickname" : "麦子",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

假设需要将 "nickname" : "麦子" 修改为 "nickname" : "水稻" ,执行如下:

  1. 更新所有字段

PUT ddz/_doc/1

{

"uid" : 10001,

"nickname" : "水稻",

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

返回信息如下:

{

"_index" : "ddz",

"_type" : "_doc",

"_id" : "1",

"_version" : 6,

"result" : "updated", # 修改操作

"_shards" : {

"total" : 2,

"successful" : 1, # 修改成功

"failed" : 0

},

"_seq_no" : 8,

"_primary_term" : 3

}

再次查看,进行验证:

GET ddz/_source/1

{

"uid" : 10001,

"nickname" : "水稻", # 修改成功

"coin" : 3000,

"phone" : 13622445609,

"score" : 203

}

上述方法,需要将文档的所有字段都列出来,有些不便。如果漏写或者写错,会导致文档与预期的不一致。

假如,我们仅执行下面命令:

PUT ddz/_doc/1

{

"nickname" : "水稻"

}

再次查看,会发现,文档仅有nickname字段了。

GET ddz/_source/1

返回如下:

{

"nickname" : "水稻"

}

2.更新特定字段

仅仅需要更新某一个字段内容时,需要调用_update 接口:

POST ddz/_update/1

{

"doc": {

"nickname": "水稻"

}

}

3.使用script 更新特定字段

也可以使用script方法来更新:

POST ddz/_update/1

{

"script": {

"source": "ctx._source.coin = params.coin;ctx._source.score = params.score;",

"lang": "painless",

"params": {

"coin": "660",

"score": "60"

}

}

}

4.查找更新字段

上述例子都是在确定文档id的情况下,对字段值做更新。而在做类似数据库SQL查找并更新字段内容操作时,需要用到接口_update_by_query,执行如下类似命令:

POST ddz/_update_by_query

{

"query": {

"match": {

"nickname": "水稻"

}

},

"script": {

"source": "ctx._source.coin = params.coin;ctx._source.score = params.score;",

"lang": "painless",

"params": {

"coin": "600",

"score": "50"

}

}

}

再次查看,会发现,找到的文档的字段coin 和score已经更新为新值了。

GET ddz/_source/1

返回如下:

{

"uid" : 10001,

"score" : "50", # 原值为:203

"phone" : 13622445609,

"nickname" : "水稻",

"coin" : "600" # 原值为:3000

}

5.中文字段的更新

注意:如果字段名字为中文,需要使用一个中括号并 escape 引号的方式来操作。

例如下存在文档:

GET ddz/_source/10

{

"uid" : 10010,

"nickname" : "玉米",

"金币" : 100,

"phone" : 13122445609,

"总分" : 20

}

更新命令类似如下:

POST ddz/_update_by_query

{

"query": {

"match": {

"nickname": "玉米"

}

},

"script": {

"source": "ctx._source[\"金币\"] = params[\"金币\"];ctx._source[\"总分\"] = params[\"总分\"];",

"lang": "painless",

"params": {

"金币": "190",

"总分": "150"

}

}

}

更新后为:

{

"总分" : "150",

"uid" : 10010,

"金币" : "190",

"phone" : 13122445609,

"nickname" : "玉米"

}

6.可新建文档的更新

如果指定的文档不存在,需要插入,而找到文档,则需要更新字段内容时,需要使用 upsert 属性来实现,执行如下类似命令:

POST ddz/_update/13

{

"script": {

"source": "ctx._source.score = params.score;ctx._source.coin = params.coin;",

"lang": "painless",

"params": {

"score" : 120, # 文档存在,仅仅更新的字段及其新值

"coin" : 6200 # 文档存在,仅仅更新的字段及其新值

}},

"upsert": { # 文档不存在,插入如下的新的文档字段内容

"uid" : 10013,

"score" : 102,

"phone" : 13134675609,

"nickname" : "小夏",

"coin" : 7200

}

}

后续见【ElasticSearch系列(二):基本数据操作(下)

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码