ES 的 文档 的 字段 也是有类型存在的
不同类型的索引方式不同
{
"broker": { // 索引
"mappings": { // 指定映射
"properties": { // 字段
"name": {
"type": "text", // 类型
"fields": { // 参数
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"birthdate": {
"type": "date"
}
}
}
}
}
类型
类型 | 数据类型 | 描述 |
---|---|---|
text | 字符串 | 会分词的文本,(通常以人类容易识别的语言书写,因为有语言处理机制,阿拉伯语、亚美尼亚语、巴斯克语、巴西语、保加利亚语、加泰罗尼亚语、中文······),例如一个推文的内容或一封邮件的内容。分析器 负责分析数据,建立倒排索引 |
keyword | 字符串 | 不分词的文本,区分小大写,完全匹配 |
long | 整数 | - |
integer | 整数 | - |
short | 整数 | - |
byte | 整数 | - |
float | 浮点数 | - |
double | 浮点数 | - |
scaled_float | 浮点数 | 用来存钱的,有固定小数位(指定 scaling_factor 参数为100,保留两位小数,这个参数本质的设定是为了节省存储空间) |
boolean | 布尔型 | - |
date | 日期 | - |
Array | 数组 | 根据存储的数据设置类型 |
binary | 二进制 | 数据不能包含\n,不参与搜索 |
nested | 嵌套 | 可做子查询的object |
object | object | 直接指定 properties 来描述内部属性 |
join | ??? | 在同一索引下建立 父子关系 parent/child,比较复杂,可能需要聚合 和高级查询知识,和分析使用场景。 |
Completion | 快速搜索建议 | 准确说它不是一个类型 |
分词解析
API:GET /_analyze
{
"analyzer": "standard",
"text": "35f142de-2931-431d-b939-111111111111"
}
参数
参数 | 名称 | 描述 |
---|---|---|
analyzer | 分析器 | 语言分析分词,一般采用默认 standard ,如果需要分析英文 使用 english |
normalizer | 指定 keyword 的一些查询逻辑,比如查询是否区分大小写 | |
boost | 在评分性查询中,增加字段的评分比重 | |
coerce | 数字强制 | 一个bool设置,默认为true,把传入的"5"自动转化成5,false 请求将被拒绝 |
copy_to | 复制字段值 | 把某一字段中的值 复制到 其他一或多个字段中去,只能用来查询,不能用来显示 |
doc_values | 关闭分词索引 | 默认true,false后 该字段不再建立分词索引,节省磁盘空间(最好用在排序和聚合字段) |
dynamic | 是否开启自动映射 | 默认为true |
enablededit | 禁用子对象解析映射 | |
format | 日期格式化 | |
ignore_above | 字符串最大长度 | 大于该长度的字符串将被忽略 |
ignore_malformed | 忽略数据类型异常 | 默认false |
index | 是否为该字段 做查询索引 | 默认true |
index_options | 指定倒排索引模式 | |
index_prefixes | 指定数据前缀关键词,加速 term 查询 | |
fields | 把一个字段 处理成 多个字段 用来做不同的查询或聚合 | |
null_value | 处理null值 | 将null处理成想要的数据形式,方便查询或显示(处理前后 数据类型要一致) |
properties | 映射指定子字段 | |
search_analyzer | 指定查询时候的语言分析器 |
dynamic
为false 手动添加映射后,是否影响查询?
true | 新检测到的字段将添加到映射中。(默认) |
false | 新检测到的字段将被忽略。这些字段不会被编入索引,因此无法搜索,但仍会出现在_source返回的匹配字段中。这些字段不会添加到映射中,必须显式添加新字段。 |
strict | 如果检测到新字段,则抛出异常并拒绝该文档。必须将新字段显式添加到映射中。 |
数据模型
type Broker struct {
Name string `json:"name"`
Phone string `json:"phone"`
Birthdate time.Time `json:"birthdate"` // 出生日期
Age int `json:"age"` // 年龄
Weight float32 `json:"weight"` // 身高
Motto string `json:"motto"` // 个性签名
Income float64 `json:"income"` // 收入
IsAuthentication bool `json:"isAuthentication"` // 是否认证
City string `json:"city"` // 城市
CompanyId uuid.UUID `json:"companyId"` // 公司Id
Company string `json:"company"` // 公司
Interests []string `json:"interests"` // 兴趣爱好
Resumes []Resume `json:"resumes"` // 入职履历
Logins []Login `json:"logins"` // 入职履历
Created time.Time `json:"created"` // 创建时间
}
创建索引指定的映射
{
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"phone": {
"type": "keyword"
},
"birthdate": {
"type": "date",
"format": "yyyy-MM-dd"
},
"age": {
"type": "long"
},
"weight": {
"type": "float"
},
"motto": {
"type": "text"
},
"income": {
"type": "scaled_float",
"scaling_factor": 100
},
"isAuthentication": {
"type": "boolean"
},
"city": {
"type": "keyword"
},
"companyId": {
"type": "keyword"
},
"company": {
"type": "keyword"
},
"interests": {
"type": "text"
},
"resumes": {
"properties": {
"city": {
"type": "keyword"
},
"companyId": {
"type": "keyword"
},
"company": {
"type": "keyword"
}
}
},
"logins": {
"type": "nested",
"properties": {
"time": {
"type": "date"
},
"port": {
"type": "keyword"
}
}
},
"created": {
"type": "date"
}
}
}
}
动态映射的映射结果
{
"broker": {
"mappings": {
"properties": {
"age": {
"type": "long"
},
"birthdate": {
"type": "date"
},
"city": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"company": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"companyId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"created": {
"type": "date"
},
"income": {
"type": "float"
},
"interests": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"isAuthentication": {
"type": "boolean"
},
"logins": {
"properties": {
"port": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"time": {
"type": "date"
}
}
},
"motto": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"phone": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"resumes": {
"properties": {
"city": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"company": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"companyId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"weight": {
"type": "float"
}
}
}
}
}
指定映射的结果
{
"broker": {
"mappings": {
"properties": {
"age": {
"type": "long"
},
"birthdate": {
"type": "date",
"format": "yyyy-MM-dd"
},
"city": {
"type": "keyword"
},
"company": {
"type": "keyword"
},
"companyId": {
"type": "keyword"
},
"created": {
"type": "date"
},
"income": {
"type": "scaled_float",
"scaling_factor": 100
},
"interests": {
"type": "text"
},
"isAuthentication": {
"type": "boolean"
},
"logins": {
"type": "nested",
"properties": {
"port": {
"type": "keyword"
},
"time": {
"type": "date"
}
}
},
"motto": {
"type": "text"
},
"name": {
"type": "keyword"
},
"phone": {
"type": "keyword"
},
"resumes": {
"properties": {
"city": {
"type": "keyword"
},
"company": {
"type": "keyword"
},
"companyId": {
"type": "keyword"
}
}
},
"weight": {
"type": "float"
}
}
}
}
}