Elasticsearch学习笔记(十一)Mapping原理
一、Mapping的功能作用
Mapping是定义如何存储和索引一个document及其所包含字段的过程。
Mapping是index和type的元数据,每个type都有自己的一个mapping,决定了字段的数据类型和建立倒排索引的行为以及搜索的行为。mapping设置字段的数据类型的时候也设置了该字段是否为exact value还是full text
Elasticsearch将值分为exact value和full text。
exact value: ,在建立倒排索引的时候,分词的时候,是将整个值一起作为一个关键词建立到倒排索引中的。当针对exact value的字段进行搜索的时候用bool布尔值进行判断
full text:会经历各种各样的处理,分词,normaliztion(时态转换,同义词转换,大小写转换),才会建立到倒排索引中,当针对full value的字段进行搜索的时候,需要计算相关度评分
exact value和full text类型的field就决定了,在一个搜索过来的时候,对exact value field或者是full text field进行搜索的行为也是不一样的,会跟建立倒排索引的行为保持一致;比如说exact value搜索的时候,就是直接按照整个值进行匹配,full text query string,也会进行分词和normalization再去倒排索引中去搜索
1、Mapping Type(ES 7.0将移除)
每个索引都有一个mapping类型以决定document如何被索引,也就是定义了一个document的索引规则
一个mapping type包括:
(1)Meta-fields:
Meta-fields被用于自定义如何处理关联的document元数据。
例如:meta-fields包括document的_index,_type,_id,_source等字段
(2) Fields/Properties:
mapping type包括与document相关的字段或属性列表
每个document都有一个_type元字段包含了type的名称。_type字段联合document的_id字段生成_uid字段。所以带有相同_id但是type不同的document可以存在同一个索引内。
ES7.0移除mapping type的原因:
(1)index类比为数据库中一个库,type类比为数据库中的一个表。但是数据库中两个不同的表中,相同名称的字段是没有关系。但是,在Elasticsearch的索引中不同的mapping type的同一个相同名称的字段都是由同一个Lucense字段提供支持。也就说,两个不同mapping type的相同名称的字段都保存在同一个Lucence字段中,而且这两个字段必须是同一个类型的数据(比如通知为date类型的数据)
(2)同一个索引中存储少量字段和没有字段的不同的实体存储会导致稀疏数据,从而干扰Lucence有效压缩document的能力
一种可选的操作是一个index下只有一个type。
2、字段数据类型(Field datatypes)
(1)每个字段都有自己的数据类型,可以是:
1)一个简单的类型,就像text,keyword,data,long,double,boolean或者ip
2)一种支持JSON的层次结构特性的类型(就像对象或嵌套)
3)或者有专门用途的类型像geo_point,geo_shape海阔卓completion
一个string字段可以被索引成全文搜索的text字段并作为排序或者聚合的keyword字段,这么做的目的是多字段。大部分数据类型通过fields参数都可以支持多字段。
3、设置防止mapping激增
索引中定义太多的字段可能会导致mapping的激增,从而引起内存的错误和难以恢复的情况。这个问题可能比预期的更新普遍。例如:如果如果每个新的document被插入同时引入新的字段,这个在动态mapping里面十分普遍。每当document里面包含新的字段,这些将结束于索引的映射.如果数据量很少的话,这些都不用担心,但是这个会成为一个mapping增长的问题。通过相关设置可以限制mapping手动或者动态创建的字段数量,以防止mapping的激增。
index.mapping.total_fields.limit :一个索引包含字段的最大数量,默认为1000
index.mapping.depth.limit: 设置一个字段的最大深度,表示字段可以包含的内部对象的数量,默认为20
index.mapping.nested_fields.limit:设置一个索引嵌套字段的最大数量,默认我50 。索引一个包含100个嵌套字段的文档实际上索引了101个文档,因为每个嵌套的文档被索引为一个单独的隐藏文档。
4、动态映射(Dynamic mapping)
字段和mapping类型在索引使用之前不需要事先定义。由于动态mapping,新增字段名称可以被自动添加,仅仅通过索引一个document。新字段可以被添加到顶级的mapping type中和内部的对象和嵌套的字段当中.
动态映射规则可以被配置以自定义用于新字段的映射过程
例如:
true or false --> boolean
123 --> long
123.45 --> double
2017-01-01 --> date
"hello world" --> string/text
5、精确映射(Explicit mapping)
我们对自己的数据要比Elasticsearch猜测更清楚多,及时刚开始的时候动态映射可以被充分使用,当时在某些时候我们想要指定我们自己的精确映射。
当创建一个索引的时候,可以创建字段映射,并且通过PUT mapping API可以给已经存在的索引添加新的字段。
6、更新存在的字段映射(field mappings)
除了文档记录之外,已经存在的字段映射field mappings不能够被修改。如果改变这些mapping就意味着已经被索引的document将失效。相反,可以创建正确的mapping的索引并且重新索引数据到当前的新索引。
只能创建index时手动建立mapping,或者新增field mapping,但是不能update field mapping
例如:
curl -XPUT 'localhost:9200/my_index?pretty' -H 'Content-Type: application/json' -d'
//添加一个索引:my_index
{
"mappings": {
"doc": { //添加一个mapping type:doc
"properties": {
"title": { //指定字段或属性
"type": "text" // 指定每个字段的数据类型和mapping
},
"name": { "type": "text" },
"age": { "type": "integer" },
"created": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
}
}
PUT /website/_mapping/article
{
"properties" : {
"new_field" : {
"type" : "string",
"index": "not_analyzed"
}
}
}
7、查看mapping
GET /index/_mapping/type
测试mapping
GET /website/_analyze
{
"field": "content",
"text": "my-dogs"
}
二、Mapping的工作机制
每个mapping有一至多个analyzer构成,每个analyzer由一至多个顺序排列的filter组成。在进行搜索文档的时候,将字段内存传给相应的analyzer处理。analyzer内部根据filter顺序依次进行处理

三、自定义Dynamic mapping
1、定制dynamic策略
true:遇到陌生字段,就进行dynamic mapping
false:遇到陌生字段,就忽略
strict:遇到陌生字段,就报错
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic": "strict",
"properties": {
"title": {
"type": "text"
},
"address": {
"type": "object",
"dynamic": "true"
}
}
}
}
}
测试1:
PUT /my_index/my_type/1
{ // dynamic:strict
"title": "my article",
"content": "this is my article", //新增字段
"address": { // dynamic:true
"province": "guangdong",
"city": "guangzhou"
}
}
{
"error": {
"root_cause": [
{
"type": "strict_dynamic_mapping_exception",
"reason": "mapping set to strict, dynamic introduction of [content] within [my_type] is not allowed"
}
],
"type": "strict_dynamic_mapping_exception",
"reason": "mapping set to strict, dynamic introduction of [content] within [my_type] is not allowed"
},
"status": 400
}
测试2:
PUT /my_index/my_type/1
{
"title": "my article",
"address": {
"province": "guangdong",
"city": "guangzhou"
}
}
GET /my_index/_mapping/my_type
{
"my_index": {
"mappings": {
"my_type": {
"dynamic": "strict",
"properties": {
"address": {
"dynamic": "true",
"properties": {
"city": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"province": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"title": {
"type": "text"
}
}
}
}
}
}
2、定制dynamic mapping策略
(1)date_detection
默认会按照一定格式识别date,比如yyyy-MM-dd。但是如果某个field先过来一个2017-01-01的值,就会被自动dynamic mapping成date,后面如果再来一个"hello world"之类的值,就会报错。可以手动关闭某个type的date_detection,如果有需要,自己手动指定某个field为date类型。
PUT /my_index/_mapping/my_type
{
"date_detection": false
}
(2)定制自己的dynamic mapping template(type level)
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic_templates": [
{ "en": {
"match": "*_en",
"match_mapping_type": "string",
"mapping": {
"type": "string",
"analyzer": "english"
}
}}
]
}}}
1)测试1:
PUT /my_index/my_type/1
{
"title": "this is my first article"
}
title没有匹配到任何的dynamic模板,默认就是standard分词器,不会过滤停用词,is会进入倒排索引,用is来搜索是可以搜索到的
2)测试2:
PUT /my_index/my_type/2
{
"title_en": "this is my first article"
}
title_en匹配到了dynamic模板,就是english分词器,会过滤停用词,is这种停用词就会被过滤掉,用is来搜索就搜索不到了
(3)定制自己的default mapping template(index level)
PUT /my_index
{
"mappings": {
"_default_": {
"_all": { "enabled": false }
},
"blog": {
"_all": { "enabled": true }
}
}
}
Elasticsearch学习笔记(十一)Mapping原理的更多相关文章
- SQLite学习笔记(十一)&&虚拟机原理
前言 我们知道任何一种关系型数据库管理系统都支持SQL(Structured Query Language),相对于文件管理系统,用户不用关心数据在数据库内部如何存取,也不需要知道底层的存储 ...
- elasticsearch学习笔记——相关插件和使用场景
logstash-input-jdbc学习 ES(elasticsearch缩写)的一大优点就是开源,插件众多.所以扩展起来非常的方便,这也造成了它的生态系统越来越强大.这种开源分享的思想真是与天朝格 ...
- Elasticsearch学习笔记一
Elasticsearch Elasticsearch(以下简称ES)是一款Java语言开发的基于Lucene的高效全文搜索引擎.它提供了一个分布式多用户能力的基于RESTful web接口的全文搜索 ...
- 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试
机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...
- python3.4学习笔记(十一) 列表、数组实例
python3.4学习笔记(十一) 列表.数组实例 #python列表,数组类型要相同,python不需要指定数据类型,可以把各种类型打包进去#python列表可以包含整数,浮点数,字符串,对象#创建 ...
- Go语言学习笔记十一: 切片(slice)
Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...
- ElasticSearch学习笔记(超详细)
文章目录 初识ElasticSearch 什么是ElasticSearch ElasticSearch特点 ElasticSearch用途 ElasticSearch底层实现 ElasticSearc ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Sqlite学习笔记(四)&&SQLite-WAL原理
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- Sqlite学习笔记(四)&&SQLite-WAL原理(转)
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
随机推荐
- Linux下安装python的gmpy2库及遇到无法定位软件包的解决办法
gmpy2需要gmp.h &mpfr.h &mpc.h 安装命令: sudo apt-get install libmpfr-dev libmpc-dev 成功之后再输入安装命令: ...
- Laravel 多数据库配置及查询操作
laravel文档好像没有写得很详细 https://docs.golaravel.com/docs/5.3/database/ Using Multiple Database Connections ...
- nginx——location匹配流程图
location匹配流程图 location理解 1.收到url请求后,nginx首先进行精确匹配(有“=”的为精确匹配),如果匹配成功,则直接返回精确匹配结果,如果没有命中则会继续向下进行普通匹配 ...
- c语言宏定义详解
1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数 ...
- 第四章:Oracle12c 数据库在linux环境安装
一:搭建yum 仓库 对于新手可以参考此文:<Vmware Workstation _linux yum 仓库搭建>.<CentOS7.2 创建本地YUM源和局域网YUM源> ...
- Mysql索引机制(B+Tree)
1,索引谁实现的: 索引是搜索引擎去实现的,在建立表的时候都会指定,搜索引擎是一种插拔式的,根据自己的选择去决定使用哪一个. 2,索引的定义: 索引是为了加速对表中数据行的检索而创建的一种分散存储的( ...
- 在python中使用print()时,raw write()返回无效的长度:OSError: raw write() returned invalid length 254 (should have been between 0 and 127)
写出一个不是code的bug,很烦恼,解决了挺长时间,都翻到外文来看,不过还是解决了,只尝试了一种简单可观的方法,希望对大家有用 我正在使用Django与Keras(tensorflow)来训练一个模 ...
- python内置模块之-logging
logging 模块主要用于写日志 logging模块主要有如下几个组件 Logger Logger对象提供应用程序可直接使用的接口 Handler Handler发送日志到适当的目的地 Filte ...
- CSS3标准盒模型还是IE怪异模型box-sizing属性的应用设置
在一个文档中,每个元素都被表示为一个矩形的盒子.盒子模型具有4个属性['外边距(margin)','边框(border)','内边距(padding)','内容(content)']. 我们要设置某个 ...
- tensorflow添加层-【老鱼学tensorflow】
本节主要定义个添加层的函数,在深度学习中是通过创建多层神经网络来实现的,因此添加层的函数会被经常用到: import tensorflow as tf def add_layer(inputs, in ...