什么是数据建模?
● 数据建模(Data modeling), 是创建数据模型的过程
○ 数据模型是对真实世界进⾏抽象描述的⼀种⼯具和⽅法,实现对现实世界的映射
○ 博客 / 作者 / ⽤户评论
○ 三个过程:概念模型 => 逻辑模型 => 数据模型(第三范式)
○ 数据模型:结合具体的数据库,在满⾜业务读写性能等需求的前提下,确定最终的定义
如何对字段进行建模?
字段类型 ==》是否要搜索及分词 ==》是否要聚合及排序 ==》是否要额外的存储
字段类型:Text v.s Keyword
● Text
○ ⽤于全⽂本字段,⽂本会被 Analyzer 分词
○ 默认不⽀持聚合分析及排序。需要设置 fielddata 为 true
● Keyword
○ ⽤于 id,枚举及不需要分词的⽂本。例如电话号码,email地址,⼿机号码 ,邮政编码,性别等
○ 适⽤于 Filter(精确匹配),Sorting 和 Aggregations
● 设置多字段类型
● 默认会为⽂本类型设置成 text,并且设置⼀个 keyword 的⼦字段
● 在处理⼈类语⾔时,通过增加“英⽂”,“拼⾳”和“标准”分词器,提⾼搜索结构
字段类型 :结构化数据
● 数值类型
● 尽量选择贴近的类型。例如可以⽤ byte,就不要⽤ long
● 枚举类型
● 设置为 keyword。即便是数字,也应该设置成 keyword,获取更加好的性能
● 其他
● ⽇期 / 布尔 / 地理信息
检索
● 如不需要检索,排序和聚合分析
● Enable 设置成 false
● 如不需要检索
● Index 设置成 false
● 对需要检索的字段,可以通过如下配置,设定存储粒度
● Index_options / Norms :不需要归⼀化数据时,可以关闭
聚合及排序
● 如不需要检索,排序和聚合分析
● Enable 设置成 false
● 如不需要排序或者聚合分析功能
● Doc_values / fielddata 设置成 false
● 更新频繁,聚合查询频繁的 keyword 类型的字段
● 推荐将 eager_global_ordinals 设置为 true
额外的存储
● 是否需要专⻔存储当前字段数据
● Store 设置成 true,可以存储该字段的原始内容
● ⼀般结合 _source 的 enabled 为 false 时候使⽤
● Disable _source:节约磁盘;适⽤于指标型数据
● ⼀般建议先考虑增加压缩⽐
● ⽆法看到 _source字段,⽆法做 ReIndex,⽆法做
Update
● Kibana 中⽆法做 discovery
举个例子
Index 一本书的信息
PUT books/_doc/1
{
"title": "Mastering ElasticSearch 5.0",
"description": "Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins",
"author": "Bharvi Dixit",
"public_date": "2017",
"cover_url": "https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}
dynamic mapping 不符合我们的预期
GET books/_mapping
对映射进行优化
#优化字段类型
指定index 则不能通过该字段进行索引,数据还是会出现在_source中
DELETE books
PUT books
{
"mappings": {
"properties": {
"author": {
"type": "keyword"
},
"cover_url": {
"type": "keyword",
"index": false
},
"description": {
"type": "text"
},
"public_date": {
"type": "date"
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 100
}
}
}
}
}
}
#Cover URL index 设置成false,无法对该字段进行搜索
POST books/_search
{
"query": {
"term": {
"cover_url": {
"value": "https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}
}
}
}
#Cover URL index 设置成false,依然支持聚合分析
POST books/_search
{
"aggs": {
"cover": {
"terms": {
"field": "cover_url",
"size": 10
}
}
}
}
DELETE books
#新增 Content字段。数据量很大。选择将Source 关闭
PUT books
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"author": {
"type": "keyword",
"store": true
},
"cover_url": {
"type": "keyword",
"index": false,
"store": true
},
"description": {
"type": "text",
"store": true
},
"content": {
"type": "text",
"store": true
},
"public_date": {
"type": "date",
"store": true
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 100
}
},
"store": true
}
}
}
}
Index 一本书的信息,包含Content
PUT books/_doc/1
{
"title": "Mastering ElasticSearch 5.0",
"description": "Master the searching, indexing, and aggregation features in ElasticSearch Improve users’ search experience with Elasticsearch’s functionalities and develop your own Elasticsearch plugins",
"content": "The content of the book......Indexing data, aggregation, searching. something else. something in the way............",
"author": "Bharvi Dixit",
"public_date": "2017",
"cover_url": "https://images-na.ssl-images-amazon.com/images/I/51OeaMFxcML.jpg"
}
#查询结果中,Source不包含数据
POST books/_search
#搜索,通过store 字段显示数据,同时高亮显示 conent的内容
POST books/_search
{
"stored_fields": ["title","author","public_date"],
"query": {
"match": {
"content": "searching"
}
},
"highlight": {
"fields": {
"content":{}
}
}
}