ElasticSearch index、mapping、document
ES中的几个概念
- 索引 index
相当于关系数据库中的数据库
- 类型 type
相当于关系数据库中的表
ES 5.x中⼀个index可以新建多个type
ES 6.x中⼀个index中只能新建⼀个type
ES 7.x中只能使用内置的_doc,不能自己新建type
- 映射 mapping
定义每个字段的类型等信息,相当于关系数据库中的表结构
- 字段 field
相当于关系数据库表的字段
- ⽂档 document
相当于关系数据库中的⼀条记录
- 分⽚ shard
集群之后,每个节点存储index的一部分,这一部分叫做一个分片。
分片有主副之分,副本分⽚(replica Shard)是主分⽚(primary Shard)的备份,当主分片故障之后,可以使用福分片代替。
ES中常用的请求方式
ES使用的的是RESTful风格的api。
![](https://img2020.cnblogs.com/blog/1685101/202004/1685101-20200429154607827-1040273043.png)
POST主要用于新建,更新、删除也可以;
PUT主要用于更新,新建也可以。
ES常用的调试方式
- Postman 十分好用,推荐
- curl命令 这个命令在Linux、Windows命令行都可以使用
#查询集群状态,如果要查询index、document,后面加/接着写就行了 #DELETE的用法类似 curl -X GET http://192.168.1.9:9200 #带数据,-H是设置header,-d是设置data #PUT用法类似 curl -X POST http://192.168.1.9:9200/xxx/xxx/xxx" -H 'Content-Type: application/json' -d' { "xxx" : "xxx", "xxx" : "xxx" }
-X可以省略,http://也可以省略。
索引操作
#新建一个index PUT 192.168.1.9:9200/mall #同时操作多个index,逗号隔开 PUT 192.168.1.9:9200/mall,student #同时操作所有index PUT 192.168.1.9:9200/_all #把PUT换为GET就是查询,换为DELETE就是删除 #以上返回的均是json,查看所有index的信息也可以这样 #indices是index的复数,?v会显示项的名称 GET 192.168.1.9:9200/_cat/indices?v #查看指定的index是否存在 #如果返回的状态码是200 OK,表示该index存在;404 Not Found表示该index不存在 #虽说GET也可以根据返回的内容来判断,但GET要获取index的具体信息,速度慢一些 HEAD 192.168.1.9:9200/mall #关闭索引 #如果不使用某个index,又不想删除它,可以关闭它 #返回的该index信息中只有一个字段“closed”:true POST 192.168.1.9:9200/mall/_close #打开索引。关闭之后需要打开,才能继续使用此index #closed字段没了 POST 192.168.1.9:9200/mall/_open #关闭和打开都是更新操作,所以用的是POST
映射操作
#新建mapping,这种带_的都是ES中预定义的。PUT也可换为POST,很多时候PUT、POST可以混用 PUT 192.168.1.9:9200/mall/_mapping #在Body->raw->JSON中添加参数,keyword是关键字字段,text是普通文本字段 { "properties": { "goods_name": { "type": "keyword" }, "goods_price": { "type": "float" }, "goods_description": { "type": "text" } } }
#也可以在创建index时就指定mapping
PUT 192.168.1.9:9200/mall
{
"mappings": {
"properties": {
"goods_name": {
"type": "text"
},
"goods_price": {
"type": "float"
},
"goods_description": {
"type": "text"
}
}
}
}
#查询mapping GET 192.168.1.9:9200/mall/_mapping #同时查询多个index的mapping,逗号分隔index GET 192.168.1.9:9200/mall,student/_mapping #增加字段。新增是在原有的mapping上修改,使用POST POST 192.168.1.9:9200/mall/_mapping #在body中添加要增加的字段 { "properties": { "category":{ "type":"keyword" }, "stock":{ "type":"keyword" } } } #mapping中只能增加字段,不能修改已存在的字段
文档操作
#####增#######
#添加一个document,需要用一个唯一的id来标识此document
#6.x还可以自己新建一个type,7.x只能使用内置的_doc,不能自己新建type
PUT 192.168.1.9:9200/mall/_doc/1
{
"goods_name":"苹果",
"goods_price":10.00,
"goods_description":"新鲜苹果,10元一斤"
}
#不用传递所有的字段
#如果没有设置mapping就直接添加document,添加第一个document时会自动根据body中的字段值来创建mapping,自动创建的mapping可能不符合我们的需求,尽量手动创建mapping
#添加一个document可以不指定id,不指定id时ES会自动生成一个唯一的id #这时不是新增文档,而是修改内置的_doc,所以要用POST POST 192.168.1.9:9200/mall/_doc { "goods_name":"芒果", "goods_price":6.00, "goods_description":"香甜芒果,6元一斤" }
#如果返回的数据中没有"action.auto_create_index":"false",说明这个字段是true,自动创建索引是开启的
GET 192.168.1.9:9200/_cluster/settings
#如果自动创建索引是开启的,创建文档时,如果索引不存在,会先自动创建索引
PUT 192.168.1.9:9200/mall/_doc/1
#新建文档时,如果文档已存在会覆盖原来的文档,可以加参数?op_type=create,仅创建,如果文档已存在则不作任何操作
PUT localhost:9200/nba/_doc/1?op_type=create
{
"goods_name":"芒果",
"goods_price":6.00,
"goods_description":"香甜芒果,6元一斤"
}
####查####
#查询一个document
GET 192.168.1.9:9200/mall/_doc/1
#同时查询多个文档。因为要在body中传递数据,用POST
POST localhost:9200/_mget
#对象数组,这些文档可以是不同的index中的
{
"docs" : [
{
"_index" : "mall",
"_type" : "_doc",
"_id" : "1"
},
{
"_index" : "mall",
"_type" : "_doc",
"_id" : "2"
}
]
}
#如果指定了index,那就只能是这个index中的文档,body中不用指定index
#POST 192.168.1.9:9200/mall/_mget
{
"docs" : [
{
"_type" : "_doc",
"_id" : "1"
},
{
"_type" : "_doc",
"_id" : "2"
}
]
}
#如果指定了index、type,那就只能是这个index、type中的文档,body中不用指定index、type
#POST 192.168.1.9:9200/mall/_doc/_mget
{
"docs" : [
{
"_id" : "1"
},
{
"_id" : "2"
}
]
}
#body也可以这样写
{
"ids" : ["1", "2"]
}
####改####
#修改整个文档
POST 192.168.1.9:9200/mall/_doc/1
{
"goods_name": "苹果",
"goods_price": 16.0,
"goods_decription":""
}
#此种方式是先删除原文档,再写入,就算只修改文档某个字段的值,都需要传入所有的字段,很麻烦
#如果要用这种方式,不要一个字段一个字段地敲,先GET查询此文档,把_source里的字段复制粘贴到body中去改
#修改|添加文档的多个字段
POST 192.168.1.9:9200/mall/_update/1
#上面查询多个文档,用的复数docs,这里修改单个文档,用单数doc
{
"doc": {
"goods_price": 16.0,
"goods_description":"..."
}
}
#这种方式只修改指定的字段,如果之前该字段不存在,会自动添加该字段
#修改|添加文档的单个字段
POST 192.168.1.9:9200/mall/_update/1
{
"script": "ctx._source.goods_price = 18"
}
#ctx是context 上下文。上面的值18是数值型,如果是字符串要加单引,或者\"转义
#如果该字段不存在,会自动添加
#移除文档的某个字段。将上面的body改一下即可
{
"script": "ctx._source.remove('goods_description')"
}
#可以使用参数
POST 192.168.1.9:9200/mall/_update/1
{
"script": {
"source": "ctx._source.goods_price = params.increment",
"params":{
"price":15.0
}
}
}
#可以进行数学运算,比如 ctx._source.goods_price += params.increment
#更新文档时如果文档不存在,不报错,可以加一个upsert字段,如果指定的文档不存在,会先自动创建该文档
POST 192.168.1.9:9200/mall/_update/3
{
"script": {
"source": "ctx._source.goods_price = params.increment",
"params":{
"increment":15.0
}
},
"upsert":{
}
}
#upsert,即update的前部+insert的后部,insert有2层含义:1、更新文档时如果文档不存在,会自动往索引中插入该文档;2、在upsert中可以插入一些字段,创建该文档后初始化字段
"upsert":{
"goods_price":0.0,
"goods_description":""
}
#比如说操作是goods_price+=increment,创建文档后需要给它初始化,才+得上去,不然默认值是null,将null和一个值相加会报错。
#如果只是=赋值操作,倒不用初始化
####删####
#删除一个文档
DELETE 192.168.1.9:9200/mall/_doc/1