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。

 

 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

 

posted @ 2020-04-16 13:16  chy_18883701161  阅读(1333)  评论(0编辑  收藏  举报