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。

请求方式操作
HEAD只获取资源的头部信息
GET获取资源
PUT新建资源
POST更新资源
DELETE删除资源

 

 

 

 

 

GET/POST,与GET相近的是更新,PUT是新建。

大部分时候,PUT、POST可以混用,都可以用来新建|更新。

 

 

 

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"
    }
 }
}


#查询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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ES(Elasticsearch)是一个分布式的搜索和分析引擎,常用于构建全文搜索引擎、日志分析、数据分析等场景。下面是index、type和mapping在ES中的作用: 1. Index(索引):在ES中,index是存储和索引文档的地方。每个index可以包含多个type,类似于关系型数据库中的表。一个index通常代表一种数据类型或者数据集合。 例如,一个名为“products”的index可以用于存储产品数据,另一个名为“users”的index可以用于存储用户数据。 2. Type(类型):在ES中,type是index中文档的逻辑分类,类似于关系型数据库中的表中的类型。每个type包含一个或多个文档(document),每个文档有自己的字段(field)。不同的type可以共享相同的mapping,也可以拥有自己独有的mapping。 例如,在“products”索引中,可以定义两个不同的type:“book”和“movie”。每个type都有自己的字段,例如“book”type可能有字段“title”、“author”、“publisher”,而“movie”type可能有字段“title”、“director”、“year”。 3. Mapping(映射):在ES中,mapping用于定义文档的字段和属性。每个index中的每个type都有自己的mappingmapping定义了字段的类型、是否需要索引、是否存储等信息。 例如,在“products”索引中,对于“book”type,可以定义字段“title”为“text”类型,需要索引,但不需要存储。对于“author”字段,可以定义为“keyword”类型,需要索引并且需要存储。这些mapping定义了文档的结构和特征,可以支持高效的搜索和聚合操作。 总之,index、type和mapping是ES中非常重要的概念,可以帮助我们组织和管理数据,并实现高效的搜索和分析。 ### 回答2: 在Elasticsearch(ES)中,index、type和mapping都是用来组织和管理存储在集群中的数据的重要概念。 1. Index(索引):索引是ES最基本的概念之一,代表了一个逻辑上的数据存储容器。它类似于传统数据库中的数据库,用于将数据进行组织和分割。每个索引都有一个唯一的名称,用于标识和访问其中存储的数据。一个ES集群可以包含多个索引,每个索引可以包含多个文档和其相关信息。 2. Type(类型):类型是指索引内的逻辑分组,用于将索引内的文档进一步分类。一个索引可以包含多个类型,每个类型通常表示一种相似的数据。例如,在一个名为"blog"的索引中,可以有类型"post"和"type",分别用于存储博客文章和评论。类型不再是ES7.x及以后版本的概念,ES7.x及以后的版本中将使用单个索引来存储数据。 3. Mapping(映射):映射是用来定义索引中的数据结构和类型的方式。它类似于传统数据库中的表结构,通过映射可以指定字段的类型、分析器、是否索引、是否存储等属性。映射将数据的结构定义为类型、字段和属性的集合,用于确定数据如何被存储和搜索。在索引创建之前,通过映射可以提前规划好数据的结构,以便进行更有效的搜索和聚合操作。 综上所述,index、type和mapping在ES中扮演着重要的角色。索引用于组织和分割数据,类型用于进一步分类和组织索引内的数据,映射用于定义和控制数据的结构和属性。它们共同促使ES成为一个强大的搜索和分析引擎,能够处理和查询大规模的分布式数据。 ### 回答3: 在Elasticsearch(ES)中,index、type和mapping都是非常重要的概念。 首先,index是ES中用于存储、组织和检索文档的单元。它类似于关系数据库中的数据库。每个index都有一个唯一的名称,我们可以在一个ES集群中创建多个index来存储不同类型的数据。index中的文档被分配到不同的分片中,以便实现高可用性和扩展性。 其次,type是index中的逻辑分类或分组。同一个index中的文档可以被分为不同的type,以便更好地组织数据。type是可选的,可以灵活地定义,用于根据业务需求创建不同类型的文档结构。然而,在ES 7.0版本之后,type已经被弃用,建议直接使用index来组织数据。 最后,mapping是定义index中文档结构和字段的方式。mapping描述了index中的每个字段的数据类型、分词器和其他属性。通过mapping,ES可以自动识别文档中的字段并进行正确的数据解析和处理。mapping还允许我们为不同的字段添加搜索、过滤和聚合等功能。ES提供了自动创建mapping的功能,也可以手动创建和修改mapping来满足特定的业务需求。 总结来说,index用于存储、组织和检索文档,type用于在index内部进行逻辑分类,而mapping则定义了index中文档的结构和字段的属性。这些都是ES中关键的概念,对于有效地管理和利用数据非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值