先展现一个document数据结构数据库
GET /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags" : [ "meibai", "fangzhu" ] } }
下面咱们就来开始分析了json
一、_index表明一个document存放在哪一个index中
二、对于document,相似的数据都是放在一个索引里面的,,非相似的数据放在不一样的索引中。例如,product_index是包含了全部商品的index,sales_index是包含了全部商品的销售数据的index,inventory_index是包含了全部库存相关的数据。若是想把全部的这些数据都放在一个索引中,好比建立一个company_index,是不合适的。
三、对于每一个索引通常都是包含了不少相似的document,相似是什么意思,其实指的就是说,这些document的fields很大一部分是相同的,若是说你放了三个document,可是每一个document的fields都彻底不同,这就不是相似了,就不太适合放到一个index里面去了。
四、对于语法,要求每一个索引名称必须是小写的,不能用下划线开头,不能包含逗号。安全
一、_type表明这个document属于index中的哪一个类别(type)
二、一个索引只能有一个type,在后面的ES高版本中可能会废弃掉
三、对于type的语法,它能够是大写或是小写,可是同时不能用下划线开头,不能包含逗号数据结构
一、_id表明document的惟一标识,与index和type一块儿,能够惟一标识和定位一个document
二、咱们能够手动指定document的id,也能够不指定,那ES就会自动为咱们建立一个id分布式
下面附上中华石衫老师的手工图,说明一下为何不一样类型的数据不用一个索引存放性能
概括一下就是若是把多个不一样类型的数据放在一个索引中存储,当用户查询某一类的数据的时候好比商品数据,大量的请求过来,发现此时后台数据分析系统对这个索引下的另外一类数据在作聚合分析好比销售数据,此时这些shard正在执行很是耗时,耗费资源的大型的聚合分析操做。就会致使document get请求,大量的性能很差,甚至超时。让用户感受上来讲,网速好慢,影响用户体验。网站
一、手动指定document id时,须要看下是否知足前提条件:
通常来讲,是从某些其余的系统中,导入一些数据到es时,会采起这种方式,就是使用系统中已有数据的惟一标识,做为es中的document id。举个例子,假如咱们如今在开发一个电商网站,作搜索功能,或者是OA系统,作员工的检索功能。这个时候数据首先会在网站系统或者IT系统内部的数据库中,会先有一份,此时确定就会有一个数据库的primary id(自增加,UUID,或者是业务编号)若是将数据导入到ES中,此时就比较适合采用数据在数据库中的已有primary key。
二、格式编码
PUT /{index}/{type}/{id}
在什么状况下使用自动的document id。对于日志的搜集使用自动的document id是比较适合的。还有就是好比咱们是在作一个系统,这个系统主要的数据存储就是es一种,也就是说,数据产生出来之后,可能就没有id,直接就放ES存储,那么这个时候,可能就不太适合说手动指定document id的形式了。
格式:spa
POST /{index}/{type}
注:自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能会发生冲突日志
(1)_source元数据
先用一个例子引出一个document的_source,以及它的结构
GET /product/_doc/1 { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "price" : 30, "producer" : "gaolujie producer", "tags" : [ "meibai", "fangzhu" ] } }
能够看出_source元数据就是说,咱们在建立一个document的时候,使用的那个放在request body请求体中的json串。
(2)定制返回结果
指定_source参数返回哪些field便可
GET /product/_doc/1?_source=name,desc,tags { "_index" : "product", "_type" : "_doc", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "name" : "gaolujie yagao", "desc" : "gaoxiao meibai", "tags" : [ "meibai", "fangzhu" ] } }
一、全量替换的语法和建立文档是同样的,若是document id不存在,那么就是建立;若是document id已经存在,那么就是全量替换操做,替换document的json串内容
二、document是不可变的,若是要修改document的内容,第一种方式就是全量替换,直接对document从新创建索引,替换里面全部的内容
三、ES会将老的document标记为deleted,而后新增咱们给定的一个document,当咱们建立愈来愈多的document的时候,es会在适当的时机在后台自动删除标记为deleted的document
建立文档和全量替换的语法是同样的,可是有时咱们想新建文档,不想替换文档
格式:
PUT /{index}/{type}/{id}?op_type=create
格式:
DELETE /{index}/{type}/{id}
注意删除并非物理删除,只是会将文档标记为deleted,当数据愈来愈多的时候,会在后台自动删除