1、Mapping的概念正则表达式
一、Mapping相似于数据库中的Schema的定义,做用以下:数据库
1)定义索引中的字段的名称;数组
2)定义字段的数据类型,例如字符串、数字、日期、布尔等;app
3)对每一个字段进行倒排索引的创建及相关配置;学习
4)Mapping会将Json文档映射成Lucene所须要的扁平格式;url
5)一个Mapping属于一个索引的Type,从7.0开始,不须要在Mapping中指定Type信息;spa
二、字段的数据类型插件
1)简单类型3d
Text(会增长Keyword子字段);code
Date;
Integer/Long/Floating;
Boolean;
IP4&IP6;
Keyword;
2)复杂类型
对象类型;
嵌套类型;
数组(由第一个非空数值的类型所决定);
空值;
3)特殊类型(地理信息)
geo_point&geo_shape
2、Dynamic Mapping的概念
一、在写入文档的时候,若是索引不存在,则会自动建立索引;
二、因为上述机制,能够无需手动定义Mapping,ElasticSearch会自动根据文档信息,推算出字段的类型;
三、可是有时候推算的可能不对,当类型设置的不对时,会致使一些功能没法正常运行,好比范围内的Range查询;
3、Mapping与Dynamic Mapping的使用
一、推断字段的类型
//建立一个文档
put mapping_test/_doc/1
{
"id":"100",
"isvip":false,
"isadmin":"true",
"age":18,
"height":180
}
//查看索引Mapping结构
get mapping_test/_mapping
//删除索引
delete mapping_test
由上图中能够得出,ElasticSearch基本上能够按照数据推断出预想的字段类型,因为isadmin字段的值是由双引号所括起来的,因此该字段被推断成text类型。
二、更改Mapping的字段类型
对于索引后期加入的字段,能够按照以下状况进行设置:
1)新增长字段
a)Dynamic设置为True时,一旦有新增字段的文档写入,Mapping同时会被更新;
b)Dynamic设置为False时,有新增字段的文档写入,Mapping不会被更新,新增字段的数据也没法被索引,可是信息会出如今_Source中;
c)Dynamic设置成Strict时,文档写入失败;
2)已有字段
a)对于已有字段,一旦已经有数据写入,就再也不支持修改字段定义。由于Lucene实现的倒排索引,一旦生成后,就不容许修改。
b)若是但愿改变已有字段类型,必须ReIndex,重建索引;
为何会这样?
I)若是修改了字段的数据类型,会致使已被索引的属于没法被搜索;
II)正由于如此,对于新增长的字段,就不会有这个问题的影响;
三、对于这几种状况,咱们经过下图进行演示:
1)对于dynamic为true时,对于建立的文档中的某一字段进行搜索,是能够查询到的。
2)将dynamic设置为false,而后新增一个name字段,而后对其搜索,是没法搜索到的。
同时mapping中也不存在该字段。
可是能够在_Source中看到这个字段。
3)将dynamic设置为strict,而后新增一个grade字段,会发现出现异常。
4、索引Mapping的显式定义
一、Mapping定义的方式有两种:
1)能够参考API手册,纯手写;
2)为了减小输入工做量,减小出错几率,能够依照如下步骤:
a)建立一个临时的Index,写入一些样本数据;
b)经过访问Mapping API获取该临时索引的动态Mapping定义;
c)修改为符合要求的Json,而后建立显式索引;
d)将临时索引删除;
二、显式Mapping定义的语法:
Put Index_Name { "mappings":{ 定义Mapping信息,Json格式
"properties":{
"column_name":{
"type":"text"
},
"column_name":{
"type":"long"
}
...
}
}
}
三、显式Mapping定义的说明:
1)控制当前字段是否能够被索引,默认是True。若是设置成False,则该字段不可被搜索。
将不被搜索的字段设置成索引为false,能够节省磁盘开销,由于这样该字段就不须要进行倒排索引了。
2)对于须要索引的字段,ElasticSearch提供了Index_options配置,能够控制倒排索引记录的内容,Index_options提供了四种控制级别:
a)docs:记录doc的Id;
b)freqs:记录doc Id、Term Frequencies;
c)positions:记录doc Id、Term Frequencies、Term Position;
d)offsets:记录doc Id、Term Frequencies、Term Position、Character offsets;
3)Text类型默认是positions级别,其余类型默认是docs级别;
4)索引字段须要记录的内容越多,那么占用存储空间越大;
5)只有keyword类型支持设定Null值;
6)copy_to的设置,是将字段的值拷贝到所设定的目标字段中,当查询时,能够将该目标字段作为搜索字段进行查询。可是该目标字段不会出如今_source中。
7)数组类型在ElasticSearch中并不提供,可是对于任何字段,是能够包含多个相同类型的数据的。
8)对字段还能够指定特定的analyzer。
9)查看索引Mapping,以下所示:
5、ElasticSearch字段特性与自定义Analyzer
一、Exact Values(精确值)、Full Text(全文本)
Exact Values就是指具体数字、日期、字符串,此类值是不须要进行分词的;
Full Text:是非结构化的文本数据,是须要进行分词的;
二、自定义分词器
当ElasticSearch自带的分词器没法知足要求时,能够自定义分词器,经过组合不一样的Character Filter、Tokenizer、Token Filter进行实现。
1)Charater Filters
a)在Tokenizer以前,经过使用Character Filters对文本进行处理,如删除或者替换字符。此种处理会影响后续Tokenizer对Term的Position与Offset的信息。
b)能够设置多个Character Filters,一个自带的Character Filters包括:HTML Strip(去除HTML标签)、Mapping(字符串替换)、Pattern Replace(正则表达式替换)。
以下图所示:
2)Tokenizer
a)将原始的文本按照必定的规则,进行切分红词(Term or Token);
b)内置的Tokenizer有:Standard、uax_url_email、WhiteSpace、keyword、Pattern、Path hierarchy;
c)能够实现本身的Tokenizer插件;
以下图所示:
3)Token Filters
a)将Tokenizer输出的Term,进行增长、修改、删除;
b)内置的Token Filters有:lowercase、stop、synonym(近义词);
以下图所示:
三、自定义Analyzer使用
在图中的emotion、customer、english_stop,是分别对Character Filter、Tokenizer、Token Filter的自定义配置。
注意:字段类型keyword与text类型的子字段keyword的说明:
一、一切文本类型的字符串能够定义成"text"或"keyword"两种类型。区别在于,text类型会使用默认分词器分词(固然也能够指定特定的分词器),keyword类型默认不会对其进行分词;
二、多字段类型状况下,查询时能够用title,也能够用title.keyword查询类型为keyword的子字段;
你们可关注个人公众号
知识学习来源:阮一鸣:《Elasticsearch核心技术与实战》