Elasticsearch 篇之Mapping 设置

ElasticSearch之mapping设置
1.mapping类似数据库中的表结构定义,主要作用如下:
定义Index下的字段名
定义字段的类型,比如数值型、字符串型、布尔型
定义倒排索引相关的配置,比如是否索引、记录position等
API:curl -uelastic:changeme -XGET http://172.21.30.11:10200/_mapping或者curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_mapping?pretty

2.自定义mapping,其中mappings是关键词,doc是type名称,“text"是字段类型,properties下面是字段名称和类型定义:
curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
{
"mappings":{
"doc":{
"dynamic":false,
"properties":{
"title":{
"type":"text"
},
"name":{
"type":"keyword"
},
"age":{
"type":"integer"
}
}
}
}
}'
Mapping中的字段类型一旦设定后,禁止直接修改,原因是Lucence实现的倒排索引生成后不允许修改,除非重新建立新的索引,然后做reindex操作。但是允许新增字段。通过dynamic参数来控制字段的新增:

  • true(默认)允许自动新增字段
  • false不允许自动新增字段,但是文档可以正常写入,但无法对字段进行查询等操作
  • strict 文档不能写入,报错

2.1.copy_to

  • 将该字段的值复制到目标字段,实现类似_all的作用
  • 不会出现在_sources中,只用来搜索
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
    {
    "mappings":{
    "doc":{
    "properties":{
    "last_name":{
    "type":"text",
    "copy_to":"full_name"
    },
    "first_name":{
    "type":"text",
    "copy_to":"full_name"
    },
    "full_name":{
    "type":"text"
    }
    }
    }
    }
    }'

curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index/doc/1?pretty -d '{
"first_name":"John",
"last_name":"Smith"
}'

curl -uelastic:changeme -XGET http://172.21.30.11:10200/my_index/_search?pretty -d '
{
"query":{
"match":{
"full_name":{
"query":"John Smith",
"operator":"and"
}
}
}
}'

2.2 index
控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可搜索.当身份证号和手机号这样的敏感信息被搜索的时候,可以设置为false,这样就可以不用建立倒排索引节省空间
curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
{
"mappings":{
"doc":{
"properties":{
"cookie":{
"type":"text",
"index":"false"
}
}
}
}
}'

curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index/doc/1?pretty -d '{
"cookie":"name=alfred"
}'

curl -uelastic:changeme -XGET http://172.21.30.11:10200/my_index/_search?pretty -d '
{
"query":{
"match":{
"cookie":"name"
}
}
}'

2.3index_options用于控制倒排索引记录的内容,有如下4中配置

  • docs 只记录doc id
  • freqs 记录doc id和term frequencies
  • positions 记录doc id、term frequencies和term position
  • offsets 记录doc id、term frequencies、term position和character offsets
    text类型默认配置为positions,其他默认为docs
    记录内容越多,占用空间越大
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
    {
    "mappings":{
    "doc":{
    "properties":{
    "cookie":{
    "type":"text",
    "index_options":"offsets"
    }
    }
    }
    }
    }'
    2.4null_value
    当字段遇到null值时的处理策略,默认为null,即空值,此时es会忽略该值。可以通过设定该值设定字段的默认值。
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/my_index -d '
    {
    "mappings":{
    "my_type":{
    "properties":{
    "status_code":{
    "type":"keyword",
    "null_value":"NULL"
    }
    }
    }
    }
    }'

3.数据类型
核心数据类型

  • 字符串型 text、keyword
  • 数值型 long、integer、short、byte、double、float、half_float、scaled_float
  • 日期类型date
  • 布尔类型 boolean
  • 二进制类型 binary
  • 范围类型 integer_range、float_range、long_range、double_range、date_range
    复杂数据类型
  • 数组类型 array
  • 对象类型 object
  • 嵌套类型 nested object
    地理位置数据类型
  • geo_point
  • geo_shape
    专用类型
  • 记录ip
  • 实现自动补全completion
  • 记录分次数token_count
  • 记录字符串hash值 murmur3
  • percolator
  • join
    多字段特性 multi-fields
    允许对同一个字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索,只需要在人名中新增一个字段为pinyin即可
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
    {
    "mappings":{
    "doc":{
    "properties":{
    "username":{
    "type":"text",
    "fields":{
    "pinyin":{
    "type":"text",
    "analyzer":"pinyin"
    }
    }
    }
    }
    }
    }
    }'

4.dynamic Mapping
es可以自动识别文档字段类型,从而降低用户使用成本。es是依靠json文档的字段类型来实现自动识别字段类型,支持的类型有:
null:忽略
boolean:boolean
浮点类型:float
整数:long
object: object
array:由第一个非null值的类型决定
string: 匹配为日期则设为date类型(默认开启)匹配为数字的话设为float或long类型(默认关闭)设为text类型,并附带keyword的子字段

4.1日期的自动识别可以自行配置日期格式,以满足各种需求

  • 默认是["strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
  • strict_date_optional_time是ISO datetime的格式,完整格式类似如下面:
    • YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:30+01:00)
  • dynamic_date_formats 可以自定义日期类型
  • date_detection可以关闭日期自动识别的机制
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
    {
    "mappings":{
    "my_type":{
    "dynamic_date_formats":["MM/dd/yyyy"]
    }
    }
    }'

curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index/my_type/1?pretty -d '{
"create_date":"09/25/2015"
}'

curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_mapping?pretty

4.2字符串是数字时,默认不会自动识别为整型,因为字符串中出现数字时完全合理的

  • numeric_detection可以开启字符串中数字的自动识别,如下所示:
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
    {
    "mappings":{
    "my_type":{
    "numeric_detection":true
    }
    }
    }'

5.Dynamic Template
允许根据es自动识别的数据类型、字段名等来动态设定字段类型,可以实现如下效果:

  • 所有字符串类型都设定为keyword类型,即默认不分词
  • 所有以message开头的字段都设定为text类型,即分词
  • 所有以long_开头的字段都设定为long类型
  • 所有自动匹配为double类型的都设定为float类型,以节省空间
    API:
    dynamic_templates是数组,可指定多个匹配规则
    string_as_keywords是template的名称
    match_mapping_type表示匹配规则
    mapping设置mapping信息
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
    {
    "mappings":{
    "doc":{
    "dynamic_templates":[
    {
    "string_as_keywords":{
    "match_mapping_type":"string",
    "mapping":{
    "type":"keyword"
    }
    }
    }
    ]
    }
    }
    }'

匹配规则一般有如下几个参数:

  • match_mapping_type匹配es自动识别的字段类型,如boolean,long,string等
  • match,unmatch匹配字段名
  • path_match,path_unmatch匹配路径
    假设我们希望以message开头的字段都设置为text类型
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/test_index -d '
    {
    "mappings":{
    "doc":{
    "dynamic_templates":[
    {
    "message_as_text":{
    "match_mapping_type":"string",
    "match":"message*",
    "mapping":{
    "type":"text"
    }
    }
    }
    ],
    写properties。。。。。
    }
    }
    }'

6.自定义mapping的建议
自定义Mapping的操作步骤如下:
1.写入一条文档到es的临时索引中,获取es自动生成的mapping
2.修改步骤1得到的mapping,自定义相关配置
3.使用步骤2的mapping穿件实际所需索引

7.索引模板,英文为Index Template,主要用于在新建索引时自动应用预先设定的配置,简化索引创建的操作步骤

  • 可以设定索引的配置和mapping
  • 可以有多个模板,根据order设置,order大的覆盖小的配置
    curl -uelastic:changeme -XPUT http://172.21.30.11:10200/_template/test_template
    {
    "index_patterns":["te","bar"],
    "order":0,
    "settings":{
    "number_of_shards":1
    },
    "mappings":{
    "doc":{
    "_source":{
    "enabled":false
    }
    "properties":{
    "name":{
    "type":"keyword"
    }
    }
    }
    }
    }'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容