ElasticSearch实战笔记

35、深度优先搜索的优点/以及通过数据夯余实现用户与博客的关联和

2020-04-21  本文已影响0人  众神开挂

主要内容: 深度优先搜索的优点/以及通过数据夯余实现用户与博客的关联和分组

1、深度优先和广度优先的对比

我们的数据,是每个演员的每个电影的评论

每个演员的评论的数量 --> 每个演员的每个电影的评论的数量

评论数量排名前10个的演员 --> 每个演员的电影取到评论数量排名前5的电影

{
  "aggs": {
    "actors": {
      "terms": {
        "field": "actors",
        "size": 10,
        "collect_mode": "breadth_first"
      },
      "aggs": {
        "costars": {
          "terms": {
            "field": "films",
            "size": 5
          }
        }
      }
    }
  }
}

深度优先的方式去执行聚合操作:

比如说,我们有10万个actor,最后其实是主要10个actor就可以了,但是我们已经深度优先的方式,构建了一整颗完整的树出来了,10万个actor,每个actor平均有10部电影,10万 + 100万 --> 110万的数据量的一颗树,裁剪掉10万个actor中的99990 actor,99990 * 10 = film,剩下10个actor,每个actor的10个film裁剪掉5个,110万 --> 10 * 5 = 50个

构建了大量的数据,然后裁剪掉了99.99%的数据,浪费了

广度优先的方式去执行聚合

10万个actor,不去构建它下面的film数据,10万 --> 99990,10个actor,构建出film,裁剪出其中的5个film即可,10万 -> 50个

2、通过数据冗余实现用户与博客的关联

1、构造冗余的用户和博客数据

第二种建模方式:用冗余数据,采用文档数据模型,进行数据建模,实现用户和博客的关联

PUT /users/_doc/1
{
  "name":     "小鱼儿",
  "email":    "xiaoyuer@sina.com",
  "birthday":      "1980-01-01"
}

PUT /blogs/_doc/1
{
  "title": "小鱼儿的第一篇博客",
  "content": "大家好,我是小鱼儿。。。",
  "userInfo": {    #数据夯余
    "userId": 1,
    "userName": "小鱼儿"
  }
}

冗余数据,就是说,将可能会进行搜索的条件和要搜索的数据,放在一个doc中

2、基于冗余用户数据搜索博客

GET /blogs/_search 
{
  "query": {
    "term": {
      "userInfo.userName.keyword": {
        "value": "小鱼儿"
      }
    }
  }
}

就不需要走应用层的join,先搜一个数据,找到id,再去搜另一份数据

直接走一个有冗余数据的type即可,指定要的搜索条件,即可搜索出自己想要的数据来

3、优点和缺点

优点:性能高,不需要执行两次搜索
缺点:数据冗余,维护成本高 --> 每次如果你的username变化了,同时要更新user type和blog type

一般来说,对于es这种NoSQL类型的数据存储来讲,都是冗余模式....

当然,你要去维护数据的关联关系,也是很有必要的,所以一旦出现冗余数据的修改,必须记得将所有关联的数据全部更新

3、对每个用户发表的博客进行分组

3.1、构造更多测试数据
PUT /users/_doc/3
{
  "name": "黄药师",
  "email": "huangyaoshi@sina.com",
  "birthday": "1970-10-24"
}

PUT /blogs/_doc/3
{
  "title": "我是黄药师",
  "content": "我是黄药师啊,各位同学们!!!",
  "userInfo": {
    "userId": 1,
    "userName": "黄药师"
  }
}

PUT /users/_doc/2
{
  "name": "花无缺",
  "email": "huawuque@sina.com",
  "birthday": "1980-02-02"
}

PUT /blogs/_doc/4
{
  "title": "花无缺的身世揭秘",
  "content": "大家好,我是花无缺,所以我的身世是。。。",
  "userInfo": {
    "userId": 2,
    "userName": "花无缺"
  }
}
3.2、对每个用户发表的博客进行分组

比如说,小鱼儿发表的那些博客,花无缺发表了哪些博客,黄药师发表了哪些博客

GET /blogs/_search 
{
  "size": 0, 
  "aggs": {
    "group_by_username": {
      "terms": {
        "field": "userInfo.userName.keyword"
      },
      "aggs": {
        "top_blogs": {
          "top_hits": {
            "_source": {
              "includes": "title"
            }, 
            "size": 5
          }
        }
      }
    }
  }
}
上一篇 下一篇

猜你喜欢

热点阅读