冗余數據方式的來建模,其實用的就是object類型,我們這里又要引入一種新的object類型,nested object類型個人感覺就像結構化數據粘合一樣,屬性之間關聯,實體之間隔離
## 1\. object與nested object
1. 首先插入一條數據
~~~
PUT /website/blogs/6
{
"title": "花無缺發表的一篇帖子",
"content": "我是花無缺,大家要不要考慮一下投資房產和買股票的事情啊。。。",
"tags": [ "投資", "理財" ],
"comments": [
{
"name": "小魚兒",
"comment": "什么股票啊?推薦一下唄",
"age": 28,
"stars": 4,
"date": "2016-09-01"
},
{
"name": "黃藥師",
"comment": "我喜歡投資房產,風,險大收益也大",
"age": 31,
"stars": 5,
"date": "2016-10-22"
}
]
}
~~~
查詢被年齡是28歲的黃藥師評論過的博客,搜索
~~~
GET /website/blogs/_search
{
"query": {
"bool": {
"must": [
{ "match": { "comments.name": "黃藥師" }},
{ "match": { "comments.age": 28 }}
]
}
}
}
~~~
得到
~~~
"_index": "website",
"_type": "blogs",
"_id": "6",
"_score": 1.8022683,
"_source": {
"title": "花無缺發表的一篇帖子",
"content": "我是花無缺,大家要不要考慮一下投資房產和買股票的事情啊。。。",
"tags": [
"投資",
"理財"
],
"comments": [
{
"name": "小魚兒",
"comment": "什么股票啊?推薦一下唄",
"age": 28,
"stars": 4,
"date": "2016-09-01"
},
{
"name": "黃藥師",
"comment": "我喜歡投資房產,風,險大收益也大",
"age": 31,
"stars": 5,
"date": "2016-10-22"
}
]
}
}
]
}
~~~
黃藥師的年齡是31,但是用28就搜出來了,這顯然是不行的,為什么會這樣呢?
object類型數據結構的底層存儲,文檔都被扁平化了
object類型底層數據結構,會將一個json數組中的數據,進行扁平化
~~~
{
"title": [ "花無缺", "發表", "一篇", "帖子" ],
"content": [ "我", "是", "花無缺", "大家", "要不要", "考慮", "一下", "投資", "房產", "買", "股票", "事情" ],
"tags": [ "投資", "理財" ],
"comments.name": [ "小魚兒", "黃藥師" ],
"comments.comment": [ "什么", "股票", "推薦", "我", "喜歡", "投資", "房產", "風險", "收益", "大" ],
"comments.age": [ 28, 31 ],
"comments.stars": [ 4, 5 ],
"comments.date": [ 2016-09-01, 2016-10-22 ]
}
~~~
所以我們age=28,也能搜索到
2. 引入nested object類型,來解決object類型底層數據結構導致的問題
* 刪除index,修改映射,把comments改成nested類型
~~~
PUT /website
{
"mappings": {
"blogs": {
"properties": {
"comments": {
"type": "nested",
"properties": {
"name": { "type": "string" },
"comment": { "type": "string" },
"age": { "type": "short" },
"stars": { "type": "short" },
"date": { "type": "date" }
}
}
}
}
}
}
~~~
此時,comments底層存儲發生改變(屬性粘合到了一起)
~~~
"comments.name": [ "小魚兒" ],
"comments.comment": [ "什么", "股票", "推薦" ],
"comments.age": [ 28 ],
"comments.stars": [ 4 ],
"comments.date": [ 2014-09-01 ]
}
{
"comments.name": [ "黃藥師" ],
"comments.comment": [ "我", "喜歡", "投資", "房產", "風險", "收益", "大" ],
"comments.age": [ 31 ],
"comments.stars": [ 5 ],
"comments.date": [ 2014-10-22 ]
}
{
"title": [ "花無缺", "發表", "一篇", "帖子" ],
"body": [ "我", "是", "花無缺", "大家", "要不要", "考慮", "一下", "投資", "房產", "買", "股票", "事情" ],
"tags": [ "投資", "理財" ]
}
~~~
* 重新插入數據
* 查詢方式改變
~~~
GET /website/blogs/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "花無缺"
}
},
{
"nested": {
"path": "comments",
"query": {
"bool": {
"must": [
{
"match": {
"comments.name": "黃藥師"
}
},
{
"match": {
"comments.age": 31
}
}
]
}
}
}
}
]
}
}
}
~~~
此時,只有age=31可以查詢到我們想要的數據
~~~
"_score": 3.6845634,
"_source": {
"title": "花無缺發表的一篇帖子",
"content": "我是花無缺,大家要不要考慮一下投資房產和買股票的事情啊。。。",
"tags": [
"投資",
"理財"
],
"comments": [
{
"name": "小魚兒",
"comment": "什么股票啊?推薦一下唄",
"age": 28,
"stars": 4,
"date": "2016-09-01"
},
{
"name": "黃藥師",
"comment": "我喜歡投資房產,風,險大收益也大",
"age": 31,
"stars": 5,
"date": "2016-10-22"
}
]
}
}
]
}
}
~~~
## 2\. nested object 聚合分析
1. 聚合數據分析的需求:按照評論日期進行bucket劃分,然后拿到每個月的評論的評分的平均值
~~~
GET /website/blogs/_search
{
"size": 0,
"aggs": {
"comments_path": {
"nested": {
"path": "comments" # 指定類型為nested
},
"aggs": { # 按照時間聚合
"group_by_comments_date": {
"date_histogram": {
"field": "comments.date",
"interval": "month",
"format": "yyyy-MM"
},
"aggs": {
"avg_stars": {
"avg": {
"field": "comments.stars"
}
}
}
}
}
}
}
}
~~~
得到
~~~
"aggregations": {
"comments_path": {
"doc_count": 2,
"group_by_comments_date": {
"buckets": [
{
"key_as_string": "2016-09",
"key": 1472688000000,
"doc_count": 1,
"avg_stars": {
"value": 4
}
},
{
"key_as_string": "2016-10",
"key": 1475280000000,
"doc_count": 1,
"avg_stars": {
"value": 5
}
}
]
}
}
}
}
~~~
2. 按照年齡段來分組,然后按照tags分組
~~~
GET /website/blogs/_search
{
"size": 0,
"aggs": {
"comments_path": {
"nested": {
"path": "comments" # 綁定為nested聚合comments對象中聚合
},
"aggs": {
"group_by_comments_age": {
"histogram": {
"field": "comments.age",
"interval": 10
},
"aggs": {
"reverse_path": {
"reverse_nested": {}, # 撤銷nested,在comments對象外聚合
"aggs": {
"group_by_tags": {
"terms": {
"field": "tags.keyword"
}
}
}
}
}
}
}
}
}
}
~~~
得到,20歲,投資理財各一個,因為只有一個doc,且`tag:[ "投資", "理財" ],`
~~~
"group_by_comments_age": {
"buckets": [
{
"key": 20,
"doc_count": 1,
"reverse_path": {
"doc_count": 1,
"group_by_tags": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "投資",
"doc_count": 1
},
{
"key": "理財",
"doc_count": 1
}
]
}
}
},
{
"key": 30,
"doc_count": 1,
"reverse_path": {
"doc_count": 1,
"group_by_tags": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "投資",
"doc_count": 1
},
{
"key": "理財",
"doc_count": 1
}
~~~
3. 按照年齡段和評分
~~~
GET /website/_search
{
"size": 0,
"aggs": {
"comments_nested": {
"nested": {
"path": "comments" # 綁定為nested聚合comments對象中聚合
},
"aggs": {
"groupby_age": {
"histogram": {
"field": "comments.age",
"interval": 10
},
"aggs": {
"groupby_start": {
"terms": {
"field": "comments.stars" # 因為在comments內,不用解綁
}
}
}
}
}
}
}
}
~~~
- springcloud
- springcloud的作用
- springboot服務提供者和消費者
- Eureka
- ribbon
- Feign
- feign在微服務中的使用
- feign充當http請求工具
- Hystrix 熔斷器
- Zuul 路由網關
- Spring Cloud Config 分布式配置中心
- config介紹與配置
- Spring Cloud Config 配置實戰
- Spring Cloud Bus
- gateway
- 概念講解
- 實例
- GateWay
- 統一日志追蹤
- 分布式鎖
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安裝
- 1.2 特性
- 1.3 實例
- 1. 整合nacos服務發現
- 2. 整合nacos配置功能
- 1.4 生產部署方案
- 環境隔離
- 原理講解
- 1. 服務發現
- 2. sentinel
- 3. Seata事務
- CAP理論
- 3.1 安裝
- 分布式協議
- 4.熔斷和降級
- springcloud與alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服務框架付費
- SkyWalking
- 介紹與相關資料
- APM系統簡單對比(zipkin,pinpoint和skywalking)
- server安裝部署
- agent安裝
- 日志清理
- 統一日志中心
- docker安裝部署
- 安裝部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定時清理數據
- index Lifecycle Management
- 沒數據排查思路
- ELK自身組件監控
- 多租戶方案
- 慢查詢sql
- 日志審計
- 開發
- 登錄認證
- 鏈路追蹤
- elk
- Filebeat
- Filebeat基礎
- Filebeat安裝部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安裝
- rpm安裝
- docker安裝Logstash
- grok調試
- Grok語法調試
- Grok常用表達式
- 配置中常見判斷
- filter提取器
- elasticsearch
- 安裝
- rpm安裝
- docker安裝es
- 使用
- 概念
- 基礎
- 中文分詞
- 統計
- 排序
- 倒排與正排索引
- 自定義dynamic
- 練習
- nested object
- 父子關系模型
- 高亮
- 搜索提示
- kibana
- 安裝
- docker安裝
- rpm安裝
- 整合
- 收集日志
- 慢sql
- 日志審計s
- 云
- 分布式架構
- 分布式鎖
- Redis實現
- redisson
- 熔斷和降級