Elasticsearch7.12搜索-索引mapping<2>

扫描关注持续好文

动态映射

概念说明

      动态映射可直接创建索引并写入文档,文档中的字段的类型是es自动识别的,不需要在创建索引的时候设置字段的类型。在实际项目中,如果遇到的业务在导入数据之前不确定有哪些字段,也不清楚字段的类型是什么,使用动态映射非常合适。es在文档文档插入时,它会利用动态映射来决定该字段的类型,并自动把该字段添加到映射中,根据字段的取值自动推测字段类型。规则如下:

JSON数据

ES中的数据类型

null

不会添加字段

true or false

boolean

floating point number

double

integer

long

object

object

array

依赖于第一个非null得值

string

如果通过了date检测,则为date

如果通过了numeric检测,则为Number

DSL实例

  • 创建索引

我们先创建一个新的索引,不指定mapping

PUT user_info_dynamic_mapping

图片

  • 查询mapping

查询该索引的mapping,可以看到mapping默认是空的

GET user_info_dynamic_mapping/_mappings

图片

  • 往索引写数据

我们往索引中写一条数据在看mappings

PUT user_info_dynamic_mapping/user_info_dynamic_mapping/1

{

   "id":1,

   "name":"张三",

   "birthdate":"1988-09-01"

}

我们看到7.0之后_doc(类型)被叫做终点名称。

图片

  • 查看mappings

再次查看该索引的mapping

GET user_info_dynamic_mapping/_mappings

图片

可以看到加入数据后产生了mapping

  • 再次写入数据

PUT user_info_dynamic_mapping/user_info_dynamic_mapping/2

{

   "id":2,

   "name":"李四",

   "birthdate":"1989-09-01",

   "sex":"男"

}

执行后mapping自动又创建了

图片

注意:当我们想关闭改功能时可在创建mapping时指定    "dynamic":"strict",

日期检测

    当索引第一条数据入库时,ElasticSearch 会自动猜测字段类型,如果该数据索引字段为日期型字符串,那么它被认为日期型,另外如果有新的字段添加第一条数据入索引也是该规则。比如:第一条数据格式为{"note":"2019-01-08"}那么改字段认定为日期型,但是实际我们想该字段为字符型,当再次添加{"note":"我是一条鱼"}这时改字段显然不是日期类型,此时会抛出异常下面我们通过设置date_detection为false来关闭日期检测

关闭日期检测

PUT  /user_info_dynamic_date

{

   "mappings": {

           "date_detection":false

   }

通过这种方式映射后面日期型也会映射为字符型,如果后面需要新增date类型字段,

元字段

    mapping元字段是mapping映射中描述文档本身的字段,大致可以分为文档属性元数据、文档元数据、索引元数据、路由元数据和自定义元数据。

分类

元数据

说明

文档属性元数据

_index

文档所属的索引

_id

文档的id

_type

文档所属类型

_uid

由_type和_id字段组成

文档元数据

_source

文档的原生json字符串

_size

整个_source字段的字节数大小

索引元数据

_all

自动组合所有的字段值

_field_names

索引了每个字段的名称

路由元数据

_parent

指定文档之间父子关系,已过时

_routing

将一个文档根据路由存储到指定分片上

自定义元数据

_meta

用于自定义元数据

  • _type

   在6.0.0中弃用。此doc的mapping type名, 自动被索引,可被查询,聚合,排序使用,或者脚本里访问 。

  • _id

    doc的id,建索引时候传入 ,不被索引, 可通过_uid被查询,脚本里使用,不能参与聚合或排序。6.0之前的版本并不是这样的,因为它们支持多种类型,所以_type和_id被合并为一个名为_uid的复合主键。

  • _uid

   在6.0.0中弃用。现在,类型已被删除,文档由_id唯一标识,_uid字段仅作为查看_id字段以保持向后兼容。

  • _source

      _source字段包含在索引时间传递的原始JSON文档正文。_source字段本身没有编入索引(因此不可搜索),但它被存储,以便在执行获取请求(如get或search)时可以返回它。默认_source字段是开启的,也就是说,默认情况下存储文档的原始值。如果某个字段内容非常多(比如一篇小说),或者查询业务只需要对该字段进行搜索,返回文档id,然后通过其他途径查看文档原文,则不需要保留_source元字段。可以通过禁用_source元字段,在ElasticSearch 中只存储倒排索引,不保留字段原始值。

  • _size

    整个_source字段的字节数大小 。

  • _all

      _all可能不再为在6.0+中创建的索引启用,请使用自定义字段和映射copy_to参数

_all字段是把其它字段拼接在一起的超级字段,所有的字段用空格分开,_all字段会被解析和索引,但是不存储。当你只想返回包含某个关键字的文档但是不明确地搜某个字段的时候就需要使用_all字段。按照官方文档的说法,_all元字段默认是禁用的,如果需要使用,可以通过"_all": {"enabled": true}开启,测试如下。PUT myindex { "mappings": { "mytype": { "_all": {"enabled": true}, "properties": { "title": { "type": "text" }, "content": { "type": "text" } } } } }但是创建失败,报错:”Enabling [_all] is disabled in 6.0. As a replacement, you can use [copy_to] on mapping fields to create your own catch all field.”看来在Elasticsearch 6. 0+中_all元字段是真的不能使用了。  

  • _field_names

    _field_names字段索引文档中每个字段的名称,其中包含除null以外的任何值。存在查询使用此字段来查找对于特定字段具有或不具有任何非空值的文档。

  • _parent

   ES6.0+改为join的实现方式,使用join数据类型。

  • _routing

     使用以下公式将文档路由到索引中的特定分片:

shard_num = hash(_routing) % num_primary_shards,The default value used for _routing is the document’s _id. 

_routing的默认值是文档的_id。自定义路由模式可以通过指定每个文档的自定义路由值来实现。

扫描关注持续好文
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值