Mapping是对索引库中文档的约束,类似于数据表结构,作用如下:
在关系型数据库中,需要事先创建数据库,然后在该数据库下创建数据表,并创建表字段,类型,长度,主键等,最后才能基于表插入数据。而Elasticsearch中不需要定义Mapping映射,在文档写入Elasticsearch时,会根据文档自动识别类型,这种机制称之为动态映射
动态映射(Dynamic Mapping)的机制,使得我们无需手动定义Mappings,Elasticsearch会自动根据文档信息,推算出字段的类型。但是有时候会推算的不对,例如地理位置信息。当类型如果设置不对时,会导致一些功能无法正常运行,例如Range查询
静态映射是在Elasticsearch中也可以实现定义好映射,包含文档的各字段类型,分词器等,这种方式称之为静态映射
核心类型 | 具体类型 | 说明 |
---|---|---|
字符串类型 | text | 可分词的文本 |
不分词的字符串 | keyword | 精确值,例如:品牌,国家,IP地址等 不能被分词 |
整数类型 | long,integer,short,byte | 在ES中id应该是个字符串keyword而不是数值类型 |
浮点类型 | double,float,half_float,scaled_float | |
日期类型 | date,date_nanos | |
布尔类型 | boolean | |
数组类型 | array | 数组类型不存在,里面是什么就是很么类型 |
对象类型 | object | |
地理位置类型 | geo_point,geo_shape | |
补全类型 | completion | 自动补全功能所需要的类型 |
二进制类型 | binary | |
范围类型 | integer_range,float_range,long_range,double_range,date_range,ip_range | |
JSON对象数组 | nested |
属性 | 含义 |
---|---|
type | 字段数据类型 |
index | 是否创建索引,默认为true |
analyzer | 使用那种分词器 |
properties | 该字段的子字段 |
copy_to | 字段拷贝,可以将当前字段拷贝到指定字段 |
store | 是否单独存储。如果设置为true,则该字段能够单独查询 |
boost | 控制算分 |
coerce | |
doc_values | |
dynamic | 动态映射设置 |
eager_global_ordinals | |
enabled | |
fielddata | |
fields | |
format | |
ignore_above | |
ignore_malformed | |
index_options | 控制倒排索引记录的内容 |
index_phrases | |
index_prefixes | |
meta | |
normalizer | |
norms | |
null_value | 对NULL值进行搜索 |
position_increment_gap | |
search_analyzer | |
similarity | |
term_vector |
POST _reindex
{
"source":{
"index":"user"
},
"dest":{
"index":"user2"
}
}
PUT /user/_alias/user
我们可以使用动态模板来告诉es,一些字段需要动态映射成相关类型,例如根据类型来判断,或者只要是根据字段名称包含ip的,动态的给一个IP的类型,而这种思路就是es提供的动态模板,Dynamic templates
动态模板是针对某个具体的索引来设定的,即在创建某个具体的索引时指定
根据文档字段的类型进行动态映射。在这种方式下,会对JSON的数据类型进行动态定义es的数据类型。从前面,我们值JSON的数据是没有类型之分,所以es会动态根据数据本身的类型来进行映射
PUT es-learn-000002
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
}
]
}
}
根据名称的规则,来定义一些特定的动态映射,这便是动态模板的第二种方式match and unmatch。在这种方式下,字段名称的匹配支持正则表达式。match表示当字段名称符合的规则时应用,unmatch表示当字段符合规则时不应用这个动态映射
PUT es-learn-000003
{
"mappings": {
"dynamic_templates": [
{
"email_keyword": {
"match": "*_email",
"mapping": {
"type": "keyword"
}
}
},
{
"ip_rule": {
"match": "*_ip",
"unmatch": "long_*",
"mapping": {
"type": "ip"
}
}
}
]
}
}
当我们插入嵌套的JSON的时候,动态映射的规则是应用在嵌套JSON里的对象
我们知道JSON可以保存复杂的嵌套关系,那么如果我们想依据嵌套关系制定相关的动态映射的规则,该怎么处理呢?path_match和path_unmatch的用法同match和unmatch的用法相似,使用正则表达式来进行匹配。只是match匹配的是字段的值,而path_match匹配的是JSON的嵌套关系
以下这段代码想实现的效果是,name下的嵌套对象,并且不是middle名字的类型都为keyword
PUT es-learn-000005
{
"mappings": {
"dynamic_templates": [
{
"middle_name_key": {
"path_match": "name.*",
"path_unmatch": "*.middle",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
PUT /[索引名称]
{
"mappings":{
"properties":{
"字段名":{
"type":"text",
"analyzer":"ik_smart"
},
"字段名2":{
"type":"keyword",
"index":false
},
"字段名3":{
"properties":{
"子字段":{
"type":"keyword"
}
}
}
}
}
}
检索一个或多个字段的映射定义。如果您不需要索引的完整映射或索引包含大量字段,这将很有用
GET /_mapping/field/[字段名]
GET /[索引名]/_mapping/field/[字段名]
GET publications/_mapping/field/title
GET publications/_mapping/field/author.id,abstract,name
GET publications/_mapping/field/a*
GET /索引名/_mapping
PUT /[索引名]
{
"mappings":{
"properties":{
"name":{
"type":"text",
"analyzer":"ik_max_word",
"copy_to":"all"
},
"business":{
"type":"keyword",
"copy_to":"all"
},
"all":{
"type":"text",
"analyzer":"ik_max_word"
}
}
}
}
控制当前字段是否被索引,默认为true。如果设置为false,该字段不可被搜索
PUT /[索引名]
{
"mappings":{
"properties":{
"name":{
"type":"text",
"index":false
}
}
}
}
控制倒排索引记录的内容
PUT /[索引名]
{
"mappings":{
"properties":{
"name":{
"type":"text",
"index_options":"offsets"
}
}
}
}
需要对NULL值进行搜索,只有keyword类型支持设计Null_value
PUT /[索引名]
{
"mappings":{
"properties":{
"name":{
"type":"keyword",
"null_value":"NULL"
}
}
}
}
在查询时,可以增加字段的算分,默认为1
# 创建索引时候指定
PUT /
{
"mappings": {
"properties": {
"": {
"type": "text",
"boost": 2
}
}
}
}
# 查询时指定
POST _search
{
"query": {
"match" : {
"title": {
"query": "quick brown fox",
"boost": 2
}
}
}
}
text字段类型不能被排序和聚合如果要text字段能被排序或聚合可以使用fields
PUT /
{
"mappings": {
"properties": {
"": {
"type": "text",
"fields":{
"":{
"type":"keyword"
}
}
}
}
}
}