范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Python3Django配合Mongodb打造高性能高扩展标签云存储方案

  书接上回,之前有一篇文章提到了标签云系统的构建:Python3.7+jieba(结巴分词)配合Wordcloud2.js来构造网站标签云(关键词集合),但是这篇只是浅显的说明了一下如何进行切词以及前端如何使用wordcloud2.js进行前端展示,本次主要讨论下标签分词切出来之后,如何进行存储。
  假设我们目前文章-标签体系的需求是这样:
  每篇文章都具有唯一的标题、描述以及 URL。
  每篇文章都具有一个或多个标签。
  每篇文章都具有作者的名称,以及喜欢
  每篇文章都有用户的评论,用户名、消息、日期时间以及评论的喜欢度。
  每篇文章都可以有 0 个或多个评论。
  那么如果使用关系型数据库来设计,比较简单的设计方案可以是这样:
  可以注意到,标签和文章的对应关系还是简单的一对多,如果做成比较灵活的多对多还需要增加一张关系表,这样就是四张表了。
  如果使用nosql比如Mongodb来说,只需要一张表(聚合)就可以实现: {      _id: POST_ID    title: TITLE_OF_POST,     description: POST_DESCRIPTION,    by: POST_BY,    url: URL_OF_POST,    tags: [TAG1, TAG2, TAG3],    likes: TOTAL_LIKES,     comments: [         {          user:"COMMENT_BY",          message: TEXT,          dateCreated: DATE_TIME,          like: LIKES        },       {          user:"COMMENT_BY",          message: TEXT,          dateCreated: DATE_TIME,          like: LIKES       }    ] }
  可以看到标签是由数组实现的,那么关系型数据库mysql和非关系型数据库mongodb在标签实现中本质上有什么区别呢?
  关系数据库如mysql中标签云的实现是简单的,标签和文章分别在不同的表中,通过join可以比较简单的查询出标签的统计数据。 而MongoDB为快速水平扩张以及极高的性能而优化,在MongoDB中没有join,倾向于使用embedding来代替linking关系。
  假设我们的需求又有了变化,普通博客变身成为具有数百万篇文章的小说站.每个小说都有许多布尔属性,大约一万个可能的属性,每篇小说都有十几个章节,假设我希望能够实时(几毫秒)请求给出的前n项任何属性组合的标签。
  你会选择推荐什么解决方案?毫无疑问,如果你在寻找极具扩展性的方案,Mongodb无疑更好。
  而且从业务角度上来讲,无论是通过标签查文章,还是文章查标签这样的需求,都非常灵活,当然了根据文章查标签一般没问题,一般都是根据标签查文章的时候有性能问题,如果是纯关系数据库比如mysql很难解决性能问题,所以要借助 es 索引解决。es 索引的时候可以将 tagid 用逗号分隔,可以很快的根据一个 tagid,或者多个 tagid 查询到关联的文章 id,一般文章列表都是分页的,有这些文章 id 了,再去关系数据库里面取文章就行了,但是es又是另外一件事了,回头我们再讨论。
  随后使用Django2.0.4来实现,首先安装好python的mongodb操作库pymongo pip3 install pymongo
  值得一提的是,它会有一个相对应bson模块 也就是说 PyMongo模块的实现是基于和它一起的bson模块的。
  bson是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型;BSON有三个特点:轻量性、可遍历性、高效性,但是空间利用率不是很理想。
  基于Django插入标签的视图: import pymongo from bson import json_util as jsonb mongo_client = pymongo.MongoClient(host="localhost", port=27017) from django.http import HttpResponse,HttpResponseRedirect,JsonResponse from django.views import View  class InsertTagsHandler(View):      def get(self,request):         db = mongo_client.test12         table = db.test12         res = table.find({"title":"123"}).count()         print(res)          if res > 0:             result = "重复数据"             return HttpResponse(json.dumps({"result":result},ensure_ascii=False))         else:             table.insert({"title":"123","desc":["123","123"]})             return HttpResponse(json.dumps({"result":"添加成功"},ensure_ascii=False))
  基于django通过文章查询标签 class FindArticleHandler(View):      def get(self,request):         db = mongo_client.test12         table = db.test12           res = table.find_one({"title":"123"},{"desc":1})          return HttpResponse(jsonb.dumps(res,ensure_ascii=False))
  基于django分组查询获取所有标签以及标签出现次数的统计 class TagsStatHandler(View):      def get(self,request):         db = mongo_client.test12         table = db.test12           pipeline = [{"$unwind":"$tags"},{"$group": {"_id": "$tags", "count": {"$sum": 1}}},]         res = table.aggregate(pipeline)          return HttpResponse(jsonb.dumps(res,ensure_ascii=False))
  基于django通过标签反查文章 class Tags2ArticleHandler(View):      def get(self,request):         db = mongo_client.test12         table = db.test12           res = table.find({"tags":{"$in":["123"]}})          return HttpResponse(jsonb.dumps(res,ensure_ascii=False))
  结语:经此一役,Mongodb的特点跃然纸上:结构灵活,表结构更改相对自由,不用每次alter的时候付出代价,适合业务快速迭代,而且json原生和大多数的语言有天然的契合。还支持数组,嵌套文档等数据类型。

还在吹美国离不开中国制造?这些潜伏在中国的美国货,你知道吗?11月财经新势力很长时间以来,世界工厂就是我国的标签。因为经济发展初期,我国缺少核心技术,只有庞大的人口数量是一个优势。所以世界上很多企业,把生产制造环节转移到我国,来享受相对低廉王者荣耀人气选手小卤蛋你真的了解他吗?鲁班七号一直以来也都是人气极高的一位射手英雄。也是很多妹子玩家特别喜欢玩的英雄,不得不说小卤蛋儿这个称号还是挺符合鲁班七号的外观模型的。接下来我就给你介绍一下小卤蛋的玩法。装备铭文值得收藏的5个护肤好物,便宜又好用,35岁的姐妹来看作为一个在美妆行业混迹了十多年的产品配方师,我想跟姐妹们分享一个很有趣的事情其实越是做护肤产品的人,越不爱买大牌。我身边的同事大多是药学或者化学专业的博士硕士,研究过的护肤品比你这人民财评做好供需对接,全力护航大学生精准就业教育部高校学生司近日发布第二期供需对接就业育人项目,包含全国866家用人单位提供的23828个就业实习项目,面向全国高校开放申请。该项目聚焦校企合作重在供需对接,通过用人单位与高校联盟新一代闪电侠亚历山大,今年的雷霆因他而不同现在看NBA西部排行榜,除了火箭(29)依然一烂到底外,倒数第二是风波不断的湖人(28),接着是16年没进季后赛的国王(36),以及状态不佳的卫冕冠军勇士(47),却缺了一个熟悉的被放生的小蝌蚪,你找到妈妈了吗?今年暑假的时候,去六盘山国家森林公园避暑。12岁的侄孙小宝,好不容易抓了一只小蝌蚪,但很快就又把小蝌蚪放生了,他说出的理由,让人刮目相看。暑假里,我们带着老母亲去旅游,因疫情防控原小萨我和蒙克能打出挡拆配合,我喜欢和他打球国王127120击败骑士,赛后中锋多曼塔斯萨博尼斯接受了采访。我们就是跑起来,打我们的比赛,转移球,命中投篮。前队友勒韦尔还跟我说,你们队跑得太快了!随着越多比赛的进行,我们越来越品牌ampampamp包装丨内衣软风暴SoftStorm(未来感十足)案例分享丨编辑曹骏彤选择了远方,便只顾风雨兼程。你好,我是曹骏彤,品牌之路,与你彤行。DesignPhotographylowkeyDesignYear2022OURGRAPHIC这五种食物不妨多吃,美容养颜全靠它这五种食物不妨多吃,美容养颜全靠它1海带如果皮肤油脂分泌不均衡,或油脂分泌过多都会引起粉刺,所以平时多吃些可以控制油脂平衡的食物,皮肤不长粉刺,自然就更美了,海带作为维生素,矿物质你买的钻石可能是假的,天然钻vs培育钻培育钻是什么呢?它是指实验室培育钻石,和天然钻石有些一定的区别,有小伙伴一不小心就会买到假的培育钻,接下来Reikii就来为大家区别一下天然钻和培育钻吧1品种天然钻石是在地球深部高林心如身材太有料了,穿白色低胸连衣裙高调亮相,不俗还挺有气质女明星的身材和气质一定是比普通人更加出挑的,比如林心如即便都已经四十多岁了,可是她的气质仍然非常出众,这一次林心如就给自己搭配了时髦的白色低胸连衣裙,清新的白色显得肤色白皙,再结合
1948年毛主席夜宿五台山,抽中上上签后却向老僧摇头感谢好意读者朋友们,在阅读文章之前,辛苦您动动小手点击一下关注,我们将持续更新历史故事,既方便您后续的阅读,又可以与志同道合的读友进行讨论,感谢您的支持。毛泽东是坚定的无产阶级工作者,奉行骗子靠造假混进中央当处长,还娶到美女翻译,最后被军区政委识破1955年,在第一届全国人大二次会议上,时任公安部部长的罗瑞卿提起一个诈骗犯的故事。此人胆大包天,在四年时间内编出无数谎言,伪造身份,私刻公章,一路混进了国家机关内部当了处长。倘若二郎山,新中国第一任水利部部长傅作义将军莅临的一个景区2007年4月30日,毕业班的同事一行十几人畅游了舞钢市国家级森林公园4A级景区二郎山。那次之游就给我留下了难以忘怀的美好印象树茂林密槐花飘香山路弯弯,曲径通幽山清水秀民风淳朴。同我们的歌杨丞琳穿衣服尺度大,羞涩了大张伟自嘲缺心眼本期安利一下综艺节目我们的歌,我很喜欢这一期的嘉宾杨丞琳和大张伟。杨丞琳一出场,就像花仙子一样,美得没有朋友,不过,她很羞涩。她坦言,为自己的礼服感到不好意思,我们会发现杨丞琳的碎吉吉贝拉金卡戴珊等明星让西装外套看起来更摩登了曾经被认为是男装的主打,现在却受到了所有人的青睐,因为它们能立刻为你的造型增添光彩和风格。从搭配无肩带连衣裙到牛仔裤再到t恤,它们都能做出适合办公室的着装。而像吉吉哈迪德和金卡戴珊五六十岁的人能不能穿年轻人的衣服?现在的时代已经不一样了,五六十岁,去主动选择大妈服的,基本上是没什么品味和个性的人,中国的大妈服那才叫个难看,是标标准准的达到了让人看起来不禁老,而且还要俗,这个俗字,满足了大多数搞笑的神回复,一个男生浏览器干干净净的,他是一个什么样的人?1。兄弟们,一米五五然后两百斤在这里属于什么级别?2。昨天刚分了一个,你过几天再来申请,这也太厉害了。3。我有九块钱我会给你九块,我有一百万我也给你九块,因为我对你的爱永远不变。4马斯克无聊公司推出新品烧焦头发香水我们可能永远无法理解富豪的脑洞,尤其是像马斯克这种巨豪怪才更是如此。近日,马斯克旗下公司BoringCompany推出了一款新品BurntHair(烧焦头发)香水,其售价为100美唐嫣出席活动,大长腿非常抢镜,这身材,羡慕了多少人?近日,有网友晒出唐嫣参加活动的视频。视频中,唐嫣留着长发,身穿浅蓝色连衣裙和紧身裙,搭配白色高跟鞋,比例非常好,尤其是一双大长腿。网友们羡慕唐嫣的身材,也羡慕她老公罗晋的好运气。唐一种混搭穿法叫丝袜运动鞋,时髦炸街谁穿谁美很早就被我们一枪否定的丝袜球鞋穿搭,如今又卷土重来,可谓是完全霸占了好身材女生穿搭的榜单。不同社交软件上的搭配博主美女姐姐们,纷纷晒出了自己的丝袜球鞋穿搭,如此显腿长又显性感的穿法小白鞋不受宠了!今年流行穿裙子乐福鞋,洋气减龄还特显瘦对于小白鞋的搭配呈现,大家是不是依旧会让其作为首选的鞋型搭配呢?的确百搭又基础的小白鞋搭配率还是很高的,但与此同时搭配过多的话真的没有什么新鲜气质的衬显效果了,尤其日常中会显得已经