ElasticSearch index、mapping、document操作,字段类型


 

基本概念

  • index:索引,可以理解为关系数据库中的数据库
  • type: 可以理解为关系数据库中的表,5.x⼀个index中可以新建多个type,6.x⼀个index中只能新建⼀个type,7.x只能使用内置的_doc,不能新建type。5.x、6.x、7.x都有内置的type _doc。
  • mapping:映射,即字段定义,可以理解为关系数据库中的表结构
  • field:字段
  • document:文档,可以理解为数据表中的⼀条记录
  • shard:分片。es集群中每个主节点只存储部分数据,所有主节点构建全部数据。一个节点上的数据叫做一个分片,主节点的分片叫做主分⽚(primary Shard),从节点的分片叫做副本分⽚(replica Shard),是对应主分片的副本。

 

index操作

#查看所有index的详细信息
GET /_cat/indices
GET /_cat/indices?v  # ?v 显示标题


#新建索引
PUT /mall

#删除索引,此功能可以实现数据过期。可以使用通配符*,eg. DELETE /log_2020_10_*
DELETE /mall

#查询指定索引的详细信息
GET /mall

#查询指定的索引是否存在。GET也可以判断,但GET要获取索引的具体信息,速度比HEAD慢很多
HEAD /mall


#不使用某个索引时可以关闭,以节约资源
POST /mall/_close

#关闭之后需要打开才能继续使用
POST /mall/_open

#关闭、打开是更新状态,用的是POST,很多时候POST、PUT可以混用

 

mapping操作

一个index对应一个mapping

#创建mapping
PUT /mall/_mapping
{ 
  "properties": {
    "goods_name": {
      "type": "keyword"
    },
    "goods_price": {
      "type": "float"
    },
    "goods_description": {
      "type": "text"
    }
  }
}


#也可以在创建index时定义mapping
PUT /mall
{
  "mappings": {
    "properties": {
      "goods_name": {
        "type": "text"
      },
      "goods_price": {
        "type": "float"
      },
      "goods_description": {
        "type": "text"
      }
    }
  }
}


#增加字段
POST /mall/_mapping
{
  "properties": {
    "category": {
      "type": "keyword"
    },
    "stock": {
      "type": "keyword"
    }
  }
}

#对于mapping,只能增加字段,不能修改已存在的字段,如果要修改已存在的字段,只能重建索引。


#查询指定index的mapping
GET /mall/_mapping

一般把短文本定义为keyword,eg. 文章标题、作者;长文本定义为text,eg. 文章摘要、内容、评论。

 

document操作

#需要用唯一的id标识此文档,不用传递所有字段
PUT /mall/_doc/1
{
  "goods_name":"苹果",
  "goods_price":10.00,
  "goods_description":"新鲜苹果,10元一斤"
}

#可以不创建index、mapping直接添加document,添加document时会自动创建index、mapping,不推荐这样做,因为字段类型可能有出入
#如果指定id的文档已存在,会覆盖原文档,可以加一个参数 /mall/_doc/1?op_type=create,只创建不覆盖,不存在才创建,已存在则报错


#添加document时可以不指定id,会自动生成一个字母、数字组成的唯一id。es将文档id存储为字符串,尽量自己指定id
#是修改内置的_doc,所以使用POST
POST /mall/_doc
{
    "goods_name":"芒果",
    "goods_price":6.00,
    "goods_description":"香甜芒果,6元一斤"
}

 

#删除指定文档
DELETE /mall/_doc/1

 

#直接覆盖原文档(先删除整个原文档,再以新文档的形式添加)
POST /mall/_doc/1
{
  "goods_name": "苹果",
  "goods_price": 16,
  "goods_decription": ""
}


#在原文档的基础上修改|添加。body中指定要修改的字段,如果该字段不存在,会自动添加
POST /mall/_update/1
{
  "doc": {
    "goods_price": 16,
    "goods_description": "..."
  }
}


#修改|添加文档的单个字段。下面使用的18是数值型,如果是字符串要加引号,单双引均可,注意需不需要转义
POST /mall/_update/1
{
  "script": "ctx._source.goods_price = 18"
  #"script": "ctx._source.goods_name = '红富士'"
  #"script": "ctx._source.goods_name = \"红富士\""
}


#移除文档中的指定字段
POST /mall/_update/1
{
  "script": "ctx._source.remove('goods_description')"
}


#可以使用参数,可以进行数学运算
POST /mall/_update/1
{
  "script": {
    "source": "ctx._source.goods_price += params.price",
    "params": {
      "price": 5
    }
  }
} 

 

#获取index中的所有文档
GET /mall/_search

#根据关键字匹配文档,会在所有字段中查找关键字
GET /mall/_search?q=苹果

#只在指定字段中查找关键字
GET /mall/_search?q=goods_name:苹果


#查询指定id的文档
GET /mall/_doc/1


#同时获取不同index中的多个文档。因为要在body中传递数据,用POST
POST /_mget
{
  "docs": [
    {
      "_index": "mall1",
      "_id": 1
    },
    {
      "_index": "mall2",
      "_id": 20
    }
  ]
}


#获取同一index中的多个文档
POST /mall/_mget
{
  "docs": [{"_id": 1},{"_id": 20}]  #可简写为 "ids": [1,20]
}

以上是7.x的写法,如果是5.x、6.x,很多地方都需要指定type

 

bulk 批量增删改文档

打开、关闭连接代价比较高,尽量把多个操作放在一个请求中完成,以提升性能。

#批量插入文档,每2行确定一个文档。文档id自动递增
POST /mall/_bulk
{ "index":{} }
{ "goods_name":"苹果","goods_price":10.0,"goods_description":"新鲜苹果,10元一斤" }
{ "index":{} }
{ "goods_name":"梨子","goods_price":5.0,"goods_description":"新鲜梨子,5元一斤" }


#也可以在前一行中手动指定文档id
POST /mall/_bulk
{ "index":{"_id":"1"} }  #文档id
{ "goods_name":"苹果","goods_price":10.0,"goods_description":"新鲜苹果,10元一斤" }
{ "index":{"_id":"2"} }
{ "goods_name":"梨子","goods_price":5.0,"goods_description":"新鲜梨子,5元一斤" }


#index、id都可以在前一行中指定
POST /_bulk
{ "index":{"_index":"mall","_id":"1"} }
{ "goods_name":"冬瓜","goods_price":5.0,"goods_description":"新鲜冬瓜,5元一斤" }
{ "index":{"_index":"mall","_id":"2"} }
{ "goods_name":"西瓜","goods_price":5.0,"goods_description":"新鲜西瓜,5元一斤" }

使用post、put均可,对document来说是新建,对index来说是更新。

index可以在url中统一指定,也可以在前一行中指定。新增时,id可以在前一行中手动指定,如果不指定会自动递增。

如果指定id的文档不存在,则为新建;如果指定id的文档已存在,则为更新。

在前一行中指定时,注意index、id的key都有前缀_。

具体操作可参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/docs-bulk.html

 

refresh 刷新数据

es默认每隔1s刷新1次索引,就是说增删改后可能不会立刻同步,需要等待0~1s

#增删改时,可以在url中添加?refresh,操作后立刻刷新索引
PUT /star/_doc/666?refresh  
{
	//......
}


#可以修改自动刷新的默认时间间隔
PUT /star/_settings
{
    "index": {
        "refresh_interval": "5s"  #默认值1s。-1表示关闭自动刷新,需要手动刷新
    }
}

 

索引别名的使用

一般使用别名代替index名称进行操作,不直接使用index名称

#查询所有的别名
GET /_alias

#查询指定index的别名
GET /nba/_alias


#别名的增删改
POST /_aliases
{
    "actions": [
        {
            "add": {  #add是新增,remove是删除,更新别名:先remove再add
                "index": "goods_info", 
                "alias": "goods"
                #"is_write_index": true  #一个别名可以对应多个index,一个index也可以对应多个别名。如果一个别名对应多个index,读时会从多个index中读取数据,需要通过此参数指定写时写到哪个index中
            },
            "add": {
                "index": "article_info", 
                "alias": "article"
            }
        }
    ]
}


#创建、删除别名也可以使用以下方式,PUT可换为POST
PUT /goods_info/_alias/goods
DELETE /goods_info/_alias/goods

 

reindex 重建索引

索引的数据结构(mapping)建立后可以增加字段,但不能修改已存在的字段,如果要修改已存在的字段,只能重建索引。
 

1、新建一个索引,新索引的名称一般使用 原索引名称_重建日期,eg. goods_20201020 ,mapping可以复制原来的mapping来改
 

2、将数据同步到新索引中

#同步等待方式
POST /_reindex
{
    "source": {
        "index": "goods"
    },
    "dest": {
        "index": "goods_20201020"
    }
}


#如果同步时间过⻓可以使用异步方式。返回的是taskId
POST /_reindex?wait_for_completion=false  #url中加一个参数即可 wait_for_completion=false
{
    "source": {
        "index": "nba"
    },
    "dest": {
        "index": "nba_20220101"
    }
}

 
3、删除旧索引,重命名新索引为旧索引的名称,如果旧索引使用了别名,还需给新索引添加别名

 

字段类型

ES常用的数据类型可分为3大类

  • 核⼼数据类型
  • 复杂数据类型
  • 专⽤数据类型

下面只列出常见的数据类型

 

核心数据类型

(1)字符串

  • text 存储长文本
  • keyword 关键字,用于存储短文本
     

(2)数值型

  • 整型: byte,short,integer,long
  • 浮点型: float,double

 

(3)日期

  • date

json没有date类型,怎么传递date类型的值?有3种方式

1、值使用特定格式的字符串,es支持的格式如下

  • “yyyy-MM-dd”
  • “yyyyMMdd”
  • “yyyyMMddHHmmss”
  • “yyyy-MM-ddTHH:mm:ss”
  • “yyyy-MM-ddTHH:mm:ss.SSS”
  • “yyyy-MM-ddTHH:mm:ss.SSSZ”

不支持常用的 “yyyy-MM-dd HH:mm:ss”
 

2、使用自定义格式的字符串,但需要在创建mapping时指定字符串格式

PUT /blog1
{
  "mappings": {
    "properties": {
      "publish_time": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"  #可以指定多种格式,||分开即可
      }
    }
  }
}

默认格式:“strict_date_optional_time||epoch_millis”
 

3、值使用毫秒级的 long 型时间戳

type仍要定义为date类型,只是值可以写成字符串或数值型的时间戳。

 

(4)范围型

  • integer_range, long_range, float_range,double_range,date_range

eg. 招聘要求年龄在[20, 40]区间上

# mapping
age_limit :{
 "type" : "integer_range"
}


# 传递数据时,值写成json对象的形式
"age_limit" : {
 "gte" : 20,
 "lte" : 40
}


# 按此字段搜索时,值写为常量。age_limit字段的值在该区间上的文档都算匹配
"term" : {
 "age_limit" : 30
}

 

(5)布尔型

  • boolean:只有2个值,true、false

 

复杂数据类型

(1)对象 object

#mapping
"user" : {
    "type":"object"
}


#传递数据时,值写成json对象形式
"user" : {
    "name":"chy",
    "age":12
}


#搜索时,字段名使用点号连接
"match":{
     "user.name":"chy"
 }

一个对象中可以嵌套对象。

 

(2)数组

#mapping。es没有专门的数组类型,指定为元素类型,插入、更新是传递数组即可
"arr" : {
    "type":"integer"
}


#元素类型要相同
"arr" : [1,3,4]

 

专用数据类型
  • completion:自动补全类型
  • ip:ip地址,值写成字符串形式
  • geo:地理位置
  • alias:别名
### 回答1: ESElasticsearch)是一个分布式的搜索和分析引擎,常用于构建全文搜索引擎、日志分析、数据分析等场景。下面是index、type和mappingES中的作用: 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和mappingES中非常重要的概念,可以帮助我们组织和管理数据,并实现高效的搜索和分析。 ### 回答2: 在ElasticsearchES)中,index、type和mapping都是用来组织和管理存储在集群中的数据的重要概念。 1. Index索引):索引ES最基本的概念之一,代表了一个逻辑上的数据存储容器。它类似于传统数据库中的数据库,用于将数据进行组织和分割。每个索引都有一个唯一的名称,用于标识和访问其中存储的数据。一个ES集群可以包含多个索引,每个索引可以包含多个文档和其相关信息。 2. Type(类型):类型是指索引内的逻辑分组,用于将索引内的文档进一步分类。一个索引可以包含多个类型,每个类型通常表示一种相似的数据。例如,在一个名为"blog"的索引中,可以有类型"post"和"type",分别用于存储博客文章和评论。类型不再是ES7.x及以后版本的概念,ES7.x及以后的版本中将使用单个索引来存储数据。 3. Mapping(映射):映射是用来定义索引中的数据结构和类型的方式。它类似于传统数据库中的表结构,通过映射可以指定字段类型、分析器、是否索引、是否存储等属性。映射将数据的结构定义为类型字段和属性的集合,用于确定数据如何被存储和搜索。在索引创建之前,通过映射可以提前规划好数据的结构,以便进行更有效的搜索和聚合操作。 综上所述,index、type和mappingES中扮演着重要的角色。索引用于组织和分割数据,类型用于进一步分类和组织索引内的数据,映射用于定义和控制数据的结构和属性。它们共同促使ES成为一个强大的搜索和分析引擎,能够处理和查询大规模的分布式数据。 ### 回答3: 在ElasticsearchES)中,index、type和mapping都是非常重要的概念。 首先,indexES中用于存储、组织和检索文档的单元。它类似于关系数据库中的数据库。每个index都有一个唯一的名称,我们可以在一个ES集群中创建多个index来存储不同类型的数据。index中的文档被分配到不同的分片中,以便实现高可用性和扩展性。 其次,type是index中的逻辑分类或分组。同一个index中的文档可以被分为不同的type,以便更好地组织数据。type是可选的,可以灵活地定义,用于根据业务需求创建不同类型的文档结构。然而,在ES 7.0版本之后,type已经被弃用,建议直接使用index来组织数据。 最后,mapping是定义index中文档结构和字段的方式。mapping描述了index中的每个字段数据类型、分词器和其他属性。通过mappingES可以自动识别文档中的字段并进行正确的数据解析和处理。mapping还允许我们为不同的字段添加搜索、过滤和聚合等功能。ES提供了自动创建mapping的功能,也可以手动创建和修改mapping来满足特定的业务需求。 总结来说,index用于存储、组织和检索文档,type用于在index内部进行逻辑分类,而mapping则定义了index中文档的结构和字段的属性。这些都是ES中关键的概念,对于有效地管理和利用数据非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值