Mapping
是定义文档及其包含的字段的存储和索引方式的过程,相当于关系型数据库中定义数据库和表结构的语句
核心数据类型 Core datatypes
- 字符串(string) : text 和 keyword
- 数字(numeric): long ,integer ,short byte double float half_float scaled_float
- 日期(date): date date_nanos (纳秒)
- 布尔(boolean)
- 二进制 (Binary)
复杂数据类型 Complex datatypes
- Object json对象
- Nested 嵌套类型
Geo 数据类型 (地理位置)
专有数据类型 Specialised datatypes
- IP IPv4 and IPv6
Range 范围
https://www.elastic.co/guide/en/elasticsearch/reference/current/range.html
数组
在Es中数组不需要专门定义,任何字段都可以包含另个或多个值即数组,数组中的所有制都必须具有相同的数据类型。
多字段 Multi-fileds
为不同的目的以不同的方式为同一字段建立索引
设置多个字段可以使用不同方式索引,使用不同的analyzer
PUT my_index
{
"mappings": {
"properties": {
"city": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"comment": {
"type": "text",
"fields": {
"english_comment": {
"type": "text",
"analyzer":"english",
"search_analyzer":"english"
}
}
}
}
}
}
Dynamic Mapping 自动创建Mapping
创建index时,不需要定义Mapping,Es根据数据类型自动判断创建类型,优点是方便,缺点是有时后自动创建类型不是你想要的数据类型。
Mapping 字段类型修改机制
1.新增字段
Dynamic 设置为true时,一旦新增字段的文档写入,Mapping也同时被更新
Dynamic 设置为false,Mapping不会被更新,新增字段的数据无法被索引,但是信息会出现在_source中。
Dynamic设置成Strict,文档写入失败
2.已有字段,一旦已经有数据写入,就不再支持修改字段定义
Lucene实现的倒排索引,一旦生成后,就不允许修改
3.如果希望改变字段类型,必须Reindex Api,重建索引,因为如果修改了字段的数据类型,会导致已经索引的数据数据无法被搜索,新增自担不会有这种影响。
PUT movies
{
"mappings":{
"_doc":{
"dynamic":"false"
}
}
}
自定义Mapping
1.参考API手册,纯手写
2.为了减少输入的工作量,减少出错概率,可以依靠以下步骤
- 创建临时的index,写入一些样本数据
- 通过访问Mapping API获取该临时文件的动态Mapping 定义
- 修改后使用该配置创建你的索引
- 删除临时索引
四种不同界别的Index Options 配置,可以控制倒排索引记录的内容
- docs – 记录doc id
- freqs – 记录doc id 和 term frequencies
- postions – 记录 doc id / term frequencies /term positon
- offsets – 记录 doc id / term frequencies /term posistion / character offects
Text类型默认记录postions,其它默认为docs
记录内容越多,占用存储空间越大
设置null_value 属性可以搜索null值
PUT users
{
"mappings":{
"properties":{
"firstName":{
"type":"text",
"index":false //不索引该字段
},
"bio":{
"type":"text",
"index_options":"offsets"
},
"mobile":{
"type":"text",
"null_value":"NULL"
}
}
}
}
精确值和全文本 Exact values vs Full Text
精确值不需要做分词处理