Elasticsearch基础概念之文档

什么是Elasticsearch文档

Elasticsearch是面向文档,文档是Elasticsearch中最小的操作(搜索、读取、删除,更新、增加)的单位。

什么是文档,一条日志、一部电影、一首歌的基本信息都可以抽象为一个文档,比如我们将一部电影抽象为下面的文档,存储在Elasticsearch中:

示例:

{
"movie_name":"肖申克的救赎",//名称
"movie_type":["剧情","犯罪"],//类型
"move_length":"142",//时长
"director":"弗兰克·达拉邦特",//导演
"language":"英语"//语言
}

特性

  • 在Elasticsearch中,文档会被序列化成JSON格式进行保存。
  • JSON对象只能包含六种字段类型,分别为字符串,数值,布尔,日期,二进制,范围类型。

Elasticsearch以JSON格式存储文档,这一点与mongodb类似,另外,我们也可以把Elasticsearch的文档类比为数据库数据表中的一行。

文档的id

每个文档都有一个唯一的id,有两种生成方式:

  • 在创建文档的时候指定文档id
  • 不指定,在创建文档时由Elasticsearch自动生成。

文档的元数据

一条文档信息,除了我们自己添字段外,Elasticsearch也会添加一些字段,作为文档的元数据,主要是以下几个字段:

字段名 说明
_index 索引名
_type 文档所属的类型名
_id 文档的唯一id
_source 文档的原始JSON数据
_all 整合所有字段内容到该字段,已废除
_version 文档的版本信息
_source 相关性打分

文档的CURD

Elasticsearch提供非常方便的Restful Api,可以非常方便对文档进行CURD等操作,而在Kibana中的Dev Tools也提供了执行Restful Api的环境,非常方便,下面的演示语句就是基于Dev Tools的。

Create

在Elasticsearch中创建文档有两种方式:

  • 使用HTTP POST方法,此时Elasticsearch会自动帮生成一个文档的id。
  • 使用HTTP PUT方法可以指定文档的id,使用这种方式,需要在URL中显示指定_create参数。

自动生成id

POST /movies/_doc
{
"movie_name":"霸王别姬",
"movie_type":["剧情","爱情"],
"move_length":"171",
"director":"陈凯歌",
"language":"汉语普通话"
}

运行结果如下:

Elasticsearch基础概念之文档

指定文档id

PUT /movies/_create/1
{
"movie_name":"肖申克的救赎",
"movie_type":["剧情","犯罪"],
"move_length":"142",
"director":"弗兰克·达拉邦特",
"language":"英语"
}

运行结果:

Elasticsearch基础概念之文档

使用这种方式创建文档,如果id已经存在了,创建的时候就会报错,比如我们再重复执行上面的语句,由于id为1的文档已经存在,会报以下的错:

Elasticsearch基础概念之文档

Index

在Elasticsearch中,索引大概有以下三种含义与作用:

  1. 动词,Elasticsearch中一种创建文档的方式,就是现在讲到的。
  2. 名词,Elasticsearch组织文档的方式,下面会讲到。
  3. 动词,对文档的字段进行分词并存储,以后会讲到
# 使用Index的方式
PUT /movies/_doc/1
{
"movies_type":["越狱","剧情","犯罪"]
}

使用 Index的方式与Create一样,都可以用于创建一个Elasticsearch文档,不同的是,使用Index创建文档时,如果指定的文档id已经存在,则会删除原文档,并重新创建一个文档,并且文档的字段_version会加1

上面语句的运行结果:

Elasticsearch基础概念之文档

Get

Elasticsearch是搜索引擎,因此当我们使用搜索语句搜索时,可以找到满足搜索条件的文档,关于搜索的语句,我们以后有专门的文章谈谈。

另外,我们也可以通过文档的id,使用HTTP的GET方法直接读取文档内容,如果找到该文档,则HTTP的状态码200,找不到则为404,如下:

# 读取
GET /movies/_doc/1

运行结果为:

Elasticsearch基础概念之文档

Update

更新一个文档的数据使用的是HTTP的POST方法,而且修改的字段信息还必须在doc中,如下:

使用Update的方式与Index区别在于,Update是直接更新文档的数据,而使用Index创建文档时,如果文档存在,则该文档会被删除,而使用新的数据重新索引一个文档。

# 更新
POST /movies/_doc/1
{
"doc":{
"movie_length":"150"
}
}

Delete

删除一个文档比较简单,使用HTTP中DELETE方法,通过文档id可以删除一个Elaticsearch的文档,比如我们删除id为1的文档:

# 删除文档
DELETE /movies/_doc/1

批量操作

上面讲解的对文档的CURD,每一次请求,都只对文档进行一次操作,但我们知道,每次操作都是建立网络请求,因此每次只做一个操作,有点浪费,Elasticsearch提供了几种批量操作文档的API。

bulk

使用bulk,可以在一次请求中同时对不同索引的不同文档进行CURD操作,极大节约网络请求方面的开销。

POST _bulk
{"create":{"_index":"movies","_id":5}}
{"movie_name":"闻香识女人","movie_type":["剧情"],"movie_length":"157","director":"马丁·布莱斯特","language":"英语"}
{"index":{"_index":"music","_id":1}}
{"music_name":"世上只有妈妈好","music_length":"5分钟"}
{"delete":{"_index":"movies","_id":1}}
{"update":{"_index":"movies","_id":10}}
{"doc":{"movie_name":"阿甘正传","movie_length":"120"}}

上面的多个操作中,如果有某个操作报错,也不会影响其他的操作,并且每一个操作都有结果返回。

mget

Elasticsearch也提供了_mget命令,用于批量获取指定的文档,其格式如下:

GET _mget
{
"docs":[
{
"_index":"movies",
"_id":"1"
},
{
"_index":"music",
"_id":"1"
}
]
}

小结

以上是学习Elastichsearch时,必备掌握的关于文档的知识与操作,也是进一步学习Elasticsearch的基础,希望能对你学习Elasticsearch有所帮助。


原文始发于微信公众号(程序员读书):Elasticsearch基础概念之文档

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/39126.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!