了解#DF19的Dreamforce

学习目标

完成本单元后,您将能够:

  • 描述什么是Dreamforce。
  • 了解您将从Dreamforce中获得的收益。
  • 了解Dreamforce的时间和地点。
  • 了解在哪里注册会议。
  • 了解什么是Dreamforce之路以及如何观看它。
  • 制定Dreamforce战略。
  • 确定参加哪些主题演讲。
  • 了解什么是议程生成器以及如何使用它。
  • 至少为独奏和小组参与者指出三个提示。
  • 描述什么包装和什么不包装。
  • 说明如何使用Dreamforce移动应用程序。
  • 制定在Dreamforce期间保持健康的计划。
  • 说明如何使用Trailblazer社区进行Dreamforce规划。

四个惊人的日子

每个人都记得他们的第一个Dreamforce。这只是多数民众赞成永远留在你的记忆烙印的生活事件之一。但是,如果您还没有享受到快乐,那您就可以大饱口福了!我们迫不及待想听听您的“第一个Dreamforce”故事。

您可能会问自己:“有什么大不了的?严格来说,是的,这是Salesforce的主要年度会议。但是Dreamforce的作用远不止于此。

来自世界各地的人们聚集在一起,分享想法,学习新技能,建立联系并受到启发。一旦你和思想领袖,行业先锋,和成千上万的同龄人交往。这样一来,您将拥有持续一生的知识,联系和记忆。

在Dreamforce期间,人们通过Dreamforce国家公园区域的入口归档。

Dreamforce拥有2700多个分组讨论会,鼓舞人心的主题演讲,一次非凡的博览会以及一场摇滚音乐会,是世界上最大的技术会议。简而言之,这是Salesforce社区的地方。

鸣叫亚当·里彭和特雷西·埃利斯·罗斯的Dreamforce大会特色的形象。
关于Dreamforce的推文。
关于Dreamforce的推文,其中包含活动中的两幅图像。

Dreamforce提高您的投资回报率

因此,您可能会相信Dreamforce是必须要做的,但也许您需要说服老板的帮助。考虑提及95%的受访者表示,他们的业务改进超过了进入Dreamforce的成本。

与会者报告了有关销售,服务和支持,协作,市场营销和IT的大多数关键业务指标的收益,其中包括:

  • 销售效率平均提高38%
  • 客户满意度平均提高33%
  • 市场营销活动平均提高29%
  • 潜在客户量增加34%
  • 集成速度提高58%

哇!但是这种魔术是如何发生的呢?

没有像Dreamforce这样的地方

Dreamforce提供了很多您无法获得的其他体验。

无国界学习 

在2700多个课程中学习和分享最佳实践,包括由Salesforce和客户专家主持的课程和剧院,动手培训,客户成功博览会(全球最大!),面向行业,管理员和开发人员的特殊领域以及广受欢迎成功圈子,您可以深入了解,并让产品专家回答您的问题。

人们在舞台上分享一台笔记本电脑。

网络就像没有明天

建立联系并分享最佳实践。无论您的角色,公司规模或行业是什么,社区都随时准备分享其知识和技能,为建立关系而兴奋,建立有意义的联系,甚至只是与您一起享用Dreamforce午餐。

随处找到灵感 

想知道Dreamforce的秘诀是什么吗?我们召集行业和有远见的思想领袖,就我们产品,行业和世界的未来进行鼓舞人心的演讲。您将精力充沛地走上去,以实现下一个业务(或个人)目标。  

平等主题演讲的开幕涉及合唱团。

大回馈

每年,Dreamforce社区都会聚在一起,产生与活动一样大的影响力。实际上,我们已经在Dreamforce上为慈善事业筹集了超过7300万美元,当我们走到一起时,我们的成就令人难以置信。在过去的几年中,我们向(RED)捐赠了300万美元,向有需要的人们捐赠了300万顿饭,并收集了超过一百万本书!

一组Dreamforce与会者。

何时何地

我们已经介绍了为什么需要您来,但是如何在何时何地举行这一惊人的活动呢?

Dreamforce将于11月19日至22日在旧金山举行。Moscone会议中心是该活动的中心,但是随着Dreamforce的发展,其校园也随之发展。活动还将在邻近的酒店和其他场所进行。 

获得通向Dreamforce的通行证

我们已经具备了全球最大的开拓者聚会的能力,但是不用担心。如果您有有效的密码,仍然可以进入。只需访问 www.dreamforce.com进行注册。请记住,酒店空间有限,请不要耽搁!

如果您没有密码,仍然可以通过免费的Expo +通行证体验Dreamforce的魔力。免费的世博+通行证是一个伟大的方式得到什么Dreamforce大会所提供的味道。它使您可以与数百个合作伙伴和数千种解决方案一起参加“客户成功博览会”。精彩的产品主题演讲和演示;梦幻森林;和更多。通行证详情即将推出。有关更多信息,请访问Dreamforce.com。

Bummer,我不能来(#sadFace) 

今年无法参加?首先,我们会想念你的。其次,您可以在Salesforce LIVE上进行现场直播 ,在整个会议期间,我们将在其中流式传输主题演讲,会议和各种好东西。

Salesforce联合创始人兼首席技术官Parker Harris出席Dreamforce。

当然,没有什么比亲身去那里更像了。那么,为什么不为您的公司播种明年将您送往Dreamforce的种子呢?

通过观看通往Dreamforce的道路来学习

通往现在的道路? 

上通往Dreamforce的道路! 在本系列网络视频的第七季中,您将看到Dreamforce在我们讨论会议,给新手的提示以及我们的实时流媒体视频系列中的更多内容上形成。主题不尽相同,从Dreamforce的操作和顶级会议到新手技巧,以及带给会议内容的最重要的指南。从闪回到闪回,Dreamforce之路可让您了解Dreamforce的所有内容并获得启发。

“通往梦想之路”的场景。

我怎么看? 

了解过去的情节,并继续在每个星期二的dreamforce.com/video上观看,直到11月的大型活动为止。无法上电脑观看直播?别担心 所有的情节都存档,供点播观看48小时的流内 Dreamforce.com/video,在 YouTube上,并在 Facebook上。

如何加入对话?

要询问实时问题并了解社区中的其他观众,请使用#RoadToDF19或@提及其特设主页上列出其Twitter帐户的演示者。

请查看 Dreamforce Facebook和 Twitter页面,以及 Trailblazer社区上的Dreamforce组。我们将收听#DF19和#RoadToDF19对话,并在接下来的情节中提取问题和有趣的语录。

注册后,就该开始在Dreamforce上计划您的一周了!

为Dreamforce制定策略

所以你很兴奋,我们也不会怪你。要做,看到,学习和体验的工作量如此之多,而时间却很少。当您进入Dreamforce时,有两种选择:克隆自己或创建Dreamforce策略。

本模块仅涵盖第二种策略-为将来的单元克隆。

当您为Dreamforce计划策略时,这里有几个问题要问自己。

  • 我的角色和经验水平是多少?
  • 我的公司有多大?
  • 我在哪个行业?
  • 我最想了解哪些产品和功能?
  • 我该如何学习?

最后一个问题非常重要,因为它可以帮助您确定要注册的体验类型。Dreamforce为所有人提供了一些功能,包括分组讨论和戏剧会议,动手培训,主题演讲,圆桌讨论,担任特殊角色的专用区域,当然还有客户成功博览会。了解自己对学习方式的偏爱可以帮助您注册正确的课程类型。

坐在长桌旁的人们,每个人都专注于他们的计算机。

专家提示:在填写日程安排时,请记住要有时间休息,并参观一些业务范围区域。

制定您的梦想Dreamforce

您可以在Dreamforce网站上获得构建梦幻Dreamforce体验所需的所有信息。在这里,您会找到Agenda Builder,这是构建完美一周并注册分组讨论会和活动的关键工具。

但是首先,让我们讨论两种方法来适应Dreamforce的发展趋势。

议程建设者 

Agenda Builder提供您注册完美会话所需的所有详细信息。为帮助您计划您的一周,我们将会议安排为主题。每个主题都是针对特定受众的,例如销售,营销人员,管理员,开发人员,中小型企业(SMB),非营利组织等等。在“议程生成器”中按主题过滤,以查看与您要查找的会话有关的分组讨论。

在如此多的会话中,我们还有其他过滤器可以缩小您的列表范围,例如产品,角色和行业。您也可以按关键字搜索以找到感兴趣的特定会话。

 戴上帽子…议程生成器即将上线 

现在让我们再谈谈注册会话。

所以这是交易:Agenda Builder现在可以使用,因此您可以计划您的一周并立即注册您的课程。您开始得越早,获得真正想要参加的会议的机会就越大。但是,如果您选择的课程已满,请不要失望。与去年一样,每个分组会议的席位中有25%留给步入式座位。我们无法保证您一定会参加,但是如果您早点排队,就可以尝试一下。

随身听的例外是极为流行的动手培训课程和成功圈子,在这里,您可以与专家教​​官一起练习一组练习,以获取实际的动手Salesforce技术。您需要预先注册这些会话。不会为步入节省空间。但是您可以排队,如果某人没有出现,也可以进入。

专家提示:使用会话Chatter组在会话之前发布您的问题。如果在会议期间未回答您的问题,那将是演示者回到办公室的时候。

除了分组讨论会外,还有许多大型的会议,称为主题演讲。

主题演讲和特别会议有什么用?

主题演讲通常吸引最大的人群,并在Moscone最大的大厅举行。对于最大的主题演讲,其他分组讨论会场馆也设有溢流室,因此请放心,如果您无法进入主会议室。

但是,为什么要发表主题演讲呢?如果您从未参加过Dreamforce主旨演讲,那您将大饱口福。您会听到激动人心的公告,并受到有远见的思想领袖的启发。主题演讲总是充满激励和乐趣,有时甚至感觉像是一个聚会。

今年无法参加Dreamforce?您可以在Salesforce LIVE上进行现场直播 ,我们将在整个会议期间流式传输主题演讲,会议和各种好东西。

做为独奏或小组参加者

第一次参加Dreamforce可能会有些艰巨,因此我们收集了一些技巧来帮助您进行准备。

在计划您的Dreamforce体验时,请考虑是自己进行还是以小组方式进行。由于尚不能选择克隆,因此有助于事前准备。

飞独奏?

您是否要独自进入Dreamforce,并需要让整个公司赢得成功?然后在整个公司内设置Dreamforce之前的会议,以收集会议和学习的愿望清单。

制定Dreamforce游戏计划,并尽可能坚持执行。但是要灵活一些-您不想错过与新朋友一起参加的自发活动!

说到新朋友,我们建议您甚至在去旧金山之前就做一些。在 开拓者社区是一个伟大的方式,以满足其他人的孤单,主治 单飞组是专门针对你的。加入其他团体,例如“ 科技女性”来结识志趣相投的女性,或参加“ Dreamforce 健康挑战”以找到锻炼伙伴。每个人都有开拓者社区小组。

Salesforce妇女网络接待会上的一大批妇女。

和你的小队一起去?

尽管#SquadGoals盛极一时,但我们有一些建议,可以在您的工作人员的帮助下使更多活动变得更加重要。

你们在一起,这意味着您不必参加所有相同的会议。分而治之!让小组成员参加不同的会议,可以使您获得更多信息,并在聚会时进行精彩的讨论。但是,不要完全避免彼此-实际上,分享和了解彼此的日程安排和计划见面以参加Dreamforce的社交活动(Dreamfest,有人吗?)是很好的。

收紧行李,收紧行李

以下是有关Dreamforce包装的一些想法。

鞋类

去安慰。这不是穿这些新便鞋或穿最时髦的高跟鞋的一周。您会站着走很多路。穿上最舒适的鞋子。让我们重复一遍:穿上最舒适的鞋子。

设备和充电器

确定要携带的设备。您真的需要一台笔记本电脑吗?如果您打算在Trailhead区域进行交互式研讨会,那么可以,您需要笔记本电脑。否则,也许您可​​以使用更小巧,更轻便的平板电脑,甚至只是智能手机。Dreamforce校园周围的各个位置都有充电站。带上充电电缆,以便您每天都可以通电或带备用电池。

天气

旧金山的天气经常变化。早晨可能是晴朗的,下午是寒冷的,晚上是多雨的。或三个小时之内全部三个。答案是分层:随着天气的变化,您可以轻松穿脱的衣服。

而当我们谈论天气时…

我们都希望天气晴朗,但以防万一,请考虑带上雨伞。雨伞越紧凑,越轻便,您就会越快乐。

不要带…

当我们谈论要带来的东西时,让我们谈论不带来的东西。太多东西了。记住,您会得到一些甜蜜的赃物,并且您需要将您的Astro玩偶存储起来以便回家!

编者注:我们既没有确认也没有否认实际上会有Astro玩偶。

Salesforce Events移动应用程序是#DF19必不可少的指南

没有比使用Salesforce Events应用程序更好的方法来构建您的Dreamforce现场指南。通过iOS和 Android设备下载您必不可少的导航指南 。使用该应用个性化您的日程安排,查看赞助商资料并在整个活动期间保持联系。

以下是充分利用#DF19的Salesforce移动应用程序的4种方法:

移动设备应用的屏幕截图:即将来临,如何进行有效的最终用户培训,社交摘要,会话详细信息和发现。

1.通过Agenda Builder建立您的个性化时间表。

在当天的议程中填入与您的兴趣相匹配的主题演讲和会议。只需点击“添加会话”,然后点击“过滤器”,您会看到按主题,角色,行业和产品细分的列表。点按“添加到议程”按钮可将项目添加到您的议程中,或点按星号将其标记为收藏,以供日后考虑。

2.通过Quest扩大您的旅程。

赚取徽章,解锁奖品,并帮助筹集100万美元,以支持在玩Quest时在湾区经历无家可归的儿童和家庭。您的任务是通过我们最受欢迎的活动和会议精心策划的旅程。首先,请在应用程序的主屏幕中查看Quest或访问位于整个校园内的任何Quest Tower。

3.获得有关如何到达那里以及在何处去现场的快速提示。

通过高级别的活动时间表在活动中进行导航,映射以引导您进入Dreamforest,开幕主题演讲以及城市周围的交通方式。

4.随时随地保持联系并与他人建立联系。

了解如何连接到我们的校园WiFi,以及如何通过主要的社交媒体渠道连接到其他与会者。您还可以了解有关通过开拓者社区回馈或与行业中其他参与者建立联系的更多信息。

史诗般的Dreamforce的更多提示

计划停机

不要把你的日程安排在the上!留下空间停机打成一片,放松,和享受。如果参加过多的课程,第二天就会精疲力尽。相反,请计划停机时间,以享受梦幻森林(在这里,您可以在阳光下放松并与其他与会者一起听音乐),或者做其他有助于您补充油箱的事情。

 可以不做任何事情就可以了 

因此,您计划了停机时间,但仍然没有考虑到清单中的所有内容?不要惊慌-录制大多数会议是为了让您在Dreamforce观看后感到愉悦。您可以在家里的沙发上看着它们,同时进行足部按摩(活动开始后,您需要使用它)。

 用餐计划 

当他们饥饿(饥饿+生气)或脱水时,没有人高兴。在忙碌的一天中,抽出时间来品尝食物和饮料(靠我们!),与您的朋友保持愉快的时光。

自助餐里没有软件的吉祥物正在休息。

 不要携带超过您的需要 

现在不是测试肩膀力量的时间或地点。这是Dreamforce,而不是您最喜欢的健身房。您的灵感来自Deepak Chopra和Ariana Huffington,而不是与您的私人教练竞争。尽可能轻便地打包,并将不必要的物品留在酒店中。

与开拓者社区提前计划

Salesforce Trailblazer社区是一个在线门户,您可以在其中访问帮助,提供反馈,提出问题以及与Salesforce合作伙伴,产品专家,员工和其他客户进行协作。

显示Dreamforce组的Trailblazer社区页面。

开拓者社区是Salesforce社区的灵魂。尽管Salesforce社区中的数百万人没有去Dreamforce的经历,但他们仍然可以加入Dreamforce社区。这使Dreamforce可以全年进行-与会者离开旧金山后,对话不会停止。

如果您在Dreamforce的四天忙碌中不能全力以赴,那么全年在社区中可以使用相同的专家领导会议。猜猜是什么,他们喜欢回答问题并分享最佳实践。真!

 我如何使用它的Dreamforce大会准备? 

充分利用社区的最佳方法之一是在活动开始之前进行联系和建立网络。您不仅可以在Dreamforce上使这些在线联系变得生动有趣,而且还可以在会议结束后继续保持联系,而无需跳动。

那么,您如何与合适的人联系?寻找合适的团体加入!每个人都有小组-Dreamforce小组使您可以在会议中进行自己的会议。我们有“ 残疾人管理者”,“ 健康与减肥”等亲和力组 。

在社区中寻找您的本地用户组,​​以便您可以在会议上面对面,然后在Dreamforce之后回到家时再次见面。我们也有基于角色和基于行业的团队,因此请注意您的专业。

坐在计算机上与Salesforce和Trailhead贴纸人群中的开放式计算机的人。

第一次参加?查找 “ Dreamforce的新手”小组以获取最佳提示和技巧。看不到您要找的东西吗?没问题!建立自己的小组,与最优秀的人联系,为您提供体验。此外,非Dreamforce小组使您可以继续进行全年合作,例如“ 入门”,“ 发布准备就绪和功能采用”,“ 网络研讨会和活动 ”等小组,甚至是产品小组。

资源资源

但是,等等……还有更多。(不是总有更多吗?)这里还有另外三种资源可以帮助您进行准备。

 网志 

订阅 Salesforce博客以获得最佳的Dreamforce信息。

您的Dreamforce  路线图

在9月结束时,我们将为许多行业和角色提供您的Dreamforce路线图的概述。这些议程包括会议,主题演讲,甚至是要参观的校园不同区域的建议。

 MOAR Trailhead! 

显然,我们喜欢Trailhead,并且您可以期望在Dreamforce上看到大量的足迹。但是为什么不领先呢?查看会话时,您会看到特定的线索,这些线索提供了有关当前主题的更多信息。做好准备,并在抵达现场之前获得MOAR徽章。

Dreamforce与会者将在Dreamforce '17上体验Trailhead区。


通过分析做出更好的决策

学习目标

完成本单元后,您将能够:

  • 在社区搜索仪表板中查看和编辑搜索报告。
  • 使用报告创建同义词组。
  • 使用报告来改善文章和讨论。

在社区管理工作区中查看搜索活动报告

每个社区都是不同的-每个人的特定风格都取决于其中的成员以及他们感兴趣的内容。您想确保社区中存有满足会员需求的内容。幸运的是,您不需要特殊的权力就能了解人们的想法。使用“社区搜索”仪表板,您可以确切地看到社区成员的需求。

信息中心可帮助您回答一些很好的问题,例如:

  • 会员搜索最多的搜索词是?
  • 哪些搜索字词没有任何结果?
  • 哪种类型的社区成员正在搜索术语?

回答完这些问题后,您可以创建内容,向社区成员提供其问题的答案。

您也不需要特殊的权限来设置社区搜索仪表板-所需的一切都是易于安装的AppExchange软件包的一部分,该软件包名为Winter ’18 Salesforce社区与Chatter社区管理软件包。

要访问社区搜索仪表板(或安装AppExchange程序包,如果还没有的话),请按照以下步骤操作:

  • 转到社区工作区。社区主持人可以从个人资料标题到达那里。
配置文件标题下拉菜单,选择了“社区工作区”
  • Salesforce管理员可以从安装程序访问社区工作区。在“快速查找”框中输入“ 所有社区 ”,然后为适当的社区选择“ 工作区”链接。
在“社区设置”页面上,选中了摩ri座咖啡厅的“工作区”链接
  • 单击仪表板
我的工作区菜单,突出显示仪表板磁贴
  • 如果您的社区中尚未安装AppExchange软件包,则可以单击“ 仪表板”页面上的“ 安装AppExchange软件包”按钮以使其启动并运行,其运行速度要比“带三层泡沫的三层半拿铁咖啡”。(不用担心,我们可以等待!)注意您将需要动手的组织用户名和密码。如果您使用的是Trailhead Playground,那么本文将向您展示如何查找用户名和重置密码。如果您无法从AppExchange安装软件包或应用程序,请按照本文中的步骤进行操作。
  • 如果您安装了托管软件包,请导航回社区工作区。要查看仪表盘现在的样子,请点击报告,然后 点击搜索
  • 要从信息中心添加和删除报告,请转到设置。在“搜索”仪表板行中,确保已选择“Community Search Dashboard 2.0”。如果您在可用仪表板列表中没有看到它,请从AppExchange下载或升级到最新的社区管理软件包。
  • 在“搜索信息中心”行中,点击编辑信息中心
仪表板>报告>设置中的仪表板列表; “搜索”行显示选中的“社区搜索仪表板2.0”,并带有“编辑仪表板”链接”/></figure>



<ul class=
  • 要移动报告,只需单击并拖动它们。要编辑报告,请点击扳手图标。要删除报告,请点击X
  • 社区搜索仪表板编辑页面,显示可移动和编辑的三列报告
    • 要添加报告,请从“组件”选项卡切换到“数据源”选项卡。搜索报告位于“ 社区报告”文件夹中。
      • 在“快速查找”框中键入搜索自动完成(1),以查找“社区搜索仪表板”中包含的报告。将要添加的报告从“报告”列拖动到仪表板区域中所需的位置(2)。
    社区搜索仪表板,显示“报告”列表,与单词“搜索”匹配的报告,以及将所需的报告拖到仪表板上的位置
    • 切换回“组件”选项卡,然后将报告类型拖动到新报告中。
    社区搜索仪表板,显示报告类型(条形图,表格等)以及将报告类型拖到何处
    • 然后,您可以通过点击编辑标题编辑报告的标题。要编辑其他报告信息,例如显示的最大值或排序顺序,请单击扳手图标,进行更改,然后单击确定
    • 一切就绪后,单击保存,然后 单击关闭

    Capricorn咖啡确保在其仪表板顶部放置三个关键报告:过去30天内的热门搜索,无结果的搜索以及按术语显示的最低搜索结果。热门搜索(30天)社区成员搜索最多的是什么?该报告告诉您他们的想法。

    例如,在过去30天里,Capricorn咖啡社区中搜索次数最多的是保修,最喜欢的咖啡,咖啡研磨机,最佳配件和法国媒体。

    “最热门搜索(30天)”报告,显示了最热门的五个搜索词的列表以及在社区中每个搜索词的搜索次数

    没有结果的搜索在社区中搜索这些术语的人们没有得到任何结果。别担心,我们有办法将那些皱眉颠倒了。

    没有结果的搜索报告,显示前五个搜索字词的列表以及在社区中每个搜索字词的搜索次数

    术语搜索最少的结果搜索这些术语的人只会得到一些结果。

    最低搜索字词搜索结果报告,显示五个搜索字词的列表以及每个字词的平均结果数

    其他一些要检查的报告以及它们回答的问题:

    自动完成点击率%(过去30天)
    自动完成搜索结果中成功点击的百分比是多少?

    自动完成搜索的使用情况(30天)
    用户是否点击了建议的搜索结果?

    登录与访客搜索(过去30天)
    输入搜索词时,有多少社区用户登录?

    自动完成次数最多(30天)
    哪些搜索字词带来了最多的建议搜索结果点击?

    每学期的结果数(30天)
    每个搜索词返回多少搜索结果?

    按会员类型搜索(过去30天)
    哪种类型的社区成员正在搜索术语?

    搜索结果结果(30天)
    结果有多少次搜寻?

    按天(30天)
    进行的无结果搜索哪一天的搜索字词结果为零?

    按类型无结果的搜索(30天)
    哪种类型的社区成员正在搜索术语,并且结果如何?

    按类型无结果的搜索(30天)
    哪种类型的社区成员正在搜索术语,并且结果如何?

    这就是Capricorn咖啡的仪表板。这四个表显示了热门​​搜索,无结果的搜索字词,获得最大结果的搜索字词以及无结果的搜索字词的列表。最后两个报告也以条形图表示。

    摩ri座咖啡的搜索仪表板,其中包含六个报告

    如果您拥有Google Analytics(分析)帐户,则可以访问更多搜索数据。例如,您可以查看人们在搜索后单击了什么,以及当人们决定创建支持案例时他们在您社区中的位置。有关更多信息,请参阅有关Google Analytics™Search Activity仪表板的文章。

    使用报告创建和改进同义词组

    查看热门搜索字词列表。它们有关系吗?例如,Capricorn注意到其热门搜索词列表包括发泡泡沫

    Capricorn还查看了没有得到结果的搜索词,并注意到 列表上有气泡。因此, Capricorn的Salesforce管理员创建了一个包含所有这些单词的同义词组。现在,正在寻找气泡的社区成员正在获得结果!

    一个组织最多可以创建10,000个同义词组,因此请退出同义词库,订购三杯意式浓缩咖啡,并参加一个聚会!

    使用报告来改进文章和讨论

    Capricorn咖啡还注意到,许多顾客正在寻找有关在家自制冷冲泡咖啡的信息。尽管Capricorn的咖啡馆助长了冷啤酒的流行趋势,但它的社区对人们正在寻找的各种详细文章还是有些了解。

    社区搜索仪表板,显示报告类型(条形图,表格等)以及将报告类型拖到何处

    Capricorn咖啡还注意到,许多顾客正在寻找有关在家自制冷冲泡咖啡的信息。尽管Capricorn的咖啡馆助长了冷啤酒的流行趋势,但它的社区对人们正在寻找的各种详细文章还是有些了解。

    Capricorn不想让自己落后于弯道,他让最好的咖啡师之一写了一篇文章,彻底了解了冷饮技术。咖啡师还启动了一个相关的讨论线程,以便其他社区成员可以提出问题并分享技术。

    实际上,咖啡师的文章如此受欢迎,以至于他成为社区的定期撰稿人,而他所工作的Capricorn咖啡厅的销售额增长了20%。

    使用报告来庆祝您的成功

    在仔细检查了所有搜索数据并开始考虑一些操作项之后,请退一步。这些数字向您显示的是,您的社区成员参与了您的产品,公司,想法。

    既然您已经了解了优化搜索如何使您的社区变得更好,那么您已经朝着确保社区继续发展壮大迈出了一大步。

    在回到磨练之前,花点时间晒晒自己的成就,这是您应得的!

    设置搜索自定义

    学习目标

    完成本单元后,您将能够:

    • 描述如何建立同义词组。
    • 解释联合搜索的工作方式。

    设置同义词组

    某处在摩羯座咖啡的客户群体,一场激烈的争论正在进行,通过简单和天真的问题提示:“它是浓缩咖啡快报?”

    社区成员可能永远无法得出令人满意的结论。但是我们可以:记住不同的人使用不同的词语来描述同一件事是很好的。在设置社区的搜索功能时,要特别记住这一点。

    可以想象,Capricorn咖啡社区有很多关于浓缩咖啡的文章。(天哪!)但是Capricorn知道至少有一些人确实使用搜索词expresso查找那些文章。Capricorn并没有涉足术语辩论,而是通过建立一个同义词小组来解决这个问题。

    同义词组具有在搜索中被同等对待的单词或短语。在同义词组中搜索一个术语将返回该组中所有术语的结果。

    Capricorn的新同义词组包含两个词:意式浓缩咖啡和特浓咖啡。现在,成员搜索使用哪个术语都无所谓-他们可以以任何一种方式找到相同的文章。

    Salesforce管理员可以在Salesforce组织中创建和编辑同义词组。

    • 转到设置,然后在“快速查找”框中输入同义词。在功能设置>搜索下选择  Synonyms
    • 在“自定义同义词组”下,单击“ 新建”以启动同义词组,或 单击“ 编辑”以更改现有组。注意默认情况下,启用由Salesforce提供的标准同义词组。
    安装程序中的“同义词”页面,突出显示“新建”按钮和“编辑”链接
    • 每组添加两到六个同义词。同义词可以是任何单词或短语。没有特殊字符。
    用于创建同义词组的对话框,其中显示六个单独的术语字段; 您还可以选择同义词组的语言
    1. 通过单击语言名称,然后单击向右箭头,为同义词组选择一种语言。
    2. 点击保存

    而且,瞧!现在,即使使用术语的变体形式,客户也不会空手而归。例如,在Capricorn的社区中,搜索expresso现在会出现使用espresso的讨论,文章和其他结果。

    搜索结果页面,显示搜索词“ expresso”和“ espresso”的结果

    在本模块的稍后部分,我们将讨论如何使用有关用户搜索词的数据来创建为您的社区服务的同义词组。

    通过联合搜索从外部来源添加搜索结果

    那里有很多信息。为什么不使用它?为您的社区创建特定于客户及其需求的内容非常好。但是,有时候,维基百科的文章可以做得很好。借助联合搜索,您可以在社区内部提供各种外部内容。

    以下是其工作原理的简要介绍。Salesforce与外部搜索提供商Coveo,Docurated和Swiftype合作,因此您的用户可以搜索他们搜索的任何网站-Google,YouTube,Wikipedia,Confluence,SharePoint等。在Salesforce管理员将外部搜索提供程序作为外部数据源连接之后,社区主持人可以像添加其他任何对象一样添加外部数据源。

    设置完所有内容后,来自外部资源的搜索结果将与其他社区搜索结果显示在同一页面上。

    我们不会在这里设置它的细节,因为这是另一个项目。但是,如果您不愿意这样做,可以在本文中找到分步说明。

    为您的社区量身定制全球搜索

    学习目标

    完成本单元后,您将能够:

    • 使更多内容可在您的社区中搜索。
    • 设置搜索结果页面。
    • 在搜索和发布发布器中配置自动完成。

    创建社区:复习

    让我们开始吧,如果您尚未打开Trailhead Playground中的社区。然后,我们将为摩ri座咖啡创建一个社区,在浏览社区搜索功能时,您可以使用该社区。

    注意:启用社区后,您将无法关闭它。

    1. 在“设置”中,在“快速查找中输入“Communities Settings”,然后选择“ 
      Communities Settings
    2. 选择Enable Communities
    3. 输入一个唯一值作为您的域名,然后点击Check Availability 。(注意:请记住,保存域名后便无法更改域名。您必须致电Salesforce进行更改。)
    4. 点击保存
    5. 单击确定

    您应该已经重定向到“设置”中的“所有社区”页面,但是如果没有,请在“快速查找”中输入“All Communities ”,然后选择“ All Communities

    1. 单击New Community
    2. 选择Customer Service 模板。
    3. 单击“Get Started
    4. 对于名称,输入Capricorn Cafe
    5. 如果要求您提供URL,请输入capricorncafe或组织中现有社区未使用的其他URL。
    6. 点击创建

    快速浏览一下。这是“社区工作区”,您可以在其中轻松访问“社区生成器”和“仪表板”,稍后我们将对其进行访问。

    使全球搜索更加全球化

    如果您的搜索结果仅限于“文章和讨论”,则您可能在使用较旧的搜索结果组件,即“搜索结果”。如果您愿意坚持这样做,那很好,但是有一些原因可以切换到较新的组件,即“全局搜索结果”。有了它,您可以:

    • 使您可以在社区中搜索来自Salesforce组织的几乎所有对象,包括自定义对象。您甚至可以从Wikipedia之类的外部来源获得结果。(我们将在下一单元中更多地讨论外部资源。)
    • 启用搜索结果过滤功能,以便用户可以优化其结果并准确找到所需内容。
    • 添加一个称为“所有结果”标签的搜索结果概述页面,使用户可以快速查看其最佳匹配项。

    如果这听起来像您的用户会为之兴奋的话,请继续阅读。如果您已经在使用“全局搜索结果”组件,但希望对其功能进行复习,那么本节的其余部分也适合您。

    要查找您社区的搜索结果组件,请转到“社区生成器”,打开“搜索模板”页面,然后单击该组件。

    1. 有几种到达社区生成器的方法。
      • 如果您按照上述步骤创建了新社区,那么您将进入“社区工作区”。单击构建器磁贴。
    Community Workspaces, with the Builder tile highlighted
    • 社区管理员登录到社区后,可以从其个人资料标题中选择Community Builder
    From the profile header, select Community Builder
    • Salesforce管理员可以从安装程序访问社区构建器。在“快速查找”框中输入“ 所有社区 ”,然后为适当的社区选择“ 构建器”链接。
    Click Builder next to a community name to edit the community
    • 在页面菜单上,在查找页面框中键入搜索。然后在模板页面下选择 搜索
    In the Pages menu, type Search in the Find a page box; then select Search under Template Pages
    • 将光标悬停在页面的搜索结果部分上。出现一个蓝色边框,您可以在顶部看到组件名称。单击以打开组件。
    将鼠标悬停在页面的该部分上时,将显示组件名称
    注意

    注意

    如果显示“搜索结果”,则很容易切换到“全局搜索结果”组件。

    1. 单击“ 搜索结果”组件上的X,以从页面中删除该组件。
    2. 要添加“全局搜索结果”组件,请单击以打开“组件”面板。将“ 全局搜索结果”组件拖动到页面的可编辑区域。
    3. 单击社区标题中的发布以保存您的更改。

    默认情况下,“全局搜索结果”组件显示文章(如果启用了知识),讨论,案例(对于Service Cloud用户)和组的结果。但是,添加在Lightning Experience中可搜索并在Napili模板中受支持的任何其他对象很容易。(要查看那些对象是什么,请查看“资源”部分中的文章“比较社区模板中可用的功能”。)通过在Salesforce组织中为对象创建自定义选项卡,也可以使自定义对象可搜索。

    全局搜索结果组件,带有默认的对象列表:讨论,文章,案例和组

    假设您希望社区成员能够搜索PDF和其他文件。

    • 在“全局搜索结果”组件的底部,单击“ 添加”。添加了可用对象列表中的第一个对象。
    • 要更改它,请单击对象名称以打开其属性。然后,在“对象”下拉列表中,选择“ 文件”
    The Global Search Results component, with the Edit Tab Properties open for the newly added object
    • 点击保存

    在添加了所有要搜索的对象之后,请保持“全局搜索结果”组件处于打开状态,以调整对象在搜索结果中的显示方式。

    搜索结果,就是客户喜欢他们的方式

    您可能已经注意到,可以将对象拖放到“全局搜索结果”组件中以更改其顺序。这就是对象在搜索结果页面上出现的顺序。因此,如果您的社区擅长于某些类型的信息,例如“文章”,请考虑将该对象放在顶部。

    您可能还注意到了两个复选框:

    • 显示所有结果标签
    • 允许搜索结果过滤

    “所有结果”选项卡使您的社区成员可以在一个页面上查看每个对象的最佳结果。当用户不确定他们的答案是在“讨论区”,“文章”还是“文件”中时,看到此概述可能会节省时间。

    “所有结果”选项卡,显示“讨论”,“文章”,“主题”,“文件”,“组”和“维基百科”的搜索结果。

    要查看对象的所有结果,请单击对象名称或查看更多

    如果选择“ 允许搜索结果过滤”,则社区成员可以通过选择搜索结果页面左侧的受支持对象然后应用过滤器来缩小搜索范围。

    搜索结果页面上“文章”的过滤选项

    默认情况下,Salesforce组织中的社区搜索过滤功能处于启用状态。从安装程序的对象管理器中,转到要过滤的每个对象的“搜索布局”。将用户要过滤的字段添加到“搜索结果”布局中。支持的字段类型是复选框,电话号码,选择列表,文本和URL。您无法过滤加密的字段。

    如果您有“讨论”的搜索结果,则还可以决定每次比赛要显示多少信息。Capricorn咖啡选择“显示所有提要的搜索结果,包括问题,帖子和评论”,以使其社区成员尽可能多地匹配其搜索词。

    讨论的“编辑”选项卡,带有一个复选框以使搜索结果可公开使用,以及一个复选框以显示所有提要中的搜索结果,包括问题,帖子和评论

    如果不选中此框,则仅搜索具有主题的问题和答案。社区成员看不到“组”中的匹配项,记录中的源或用户个人资料中的源。

    做出决定时要考虑的事项:选中此框时,搜索结果页面还会显示有关每个匹配讨论的更多信息。

    这是Capricorn的讨论搜索结果,其中的复选框已选中。每个结果都显示帖子的标题和文本,以及分配给帖子的主题。这种扩展的格式使成员更容易扫描完整的帖子以获取信息。

    扩展了“讨论”的搜索结果; 每个结果都显示帖子的标题和文本,以及分配给帖子的主题

    没有选中此框,Capricorn Discussion的“讨论”搜索结果如下所示。请注意,结果不包含帖子中的任何文本。这种紧凑的提要使扫描帖子标题变得更加容易。

    压缩“讨论”的搜索结果; 每个结果均显示帖子标题,帖子作者以及分配给帖子的主题

    如果“讨论结果”紧凑,这对您的社区来说更重要,请不要选中此框。

    要查看新搜索结果页面的效果如何,请在“全局搜索结果”组件的“搜索词”字段中输入一个测试词,然后按Enter。(如果您正在新的Trailhead游乐场中追踪,则可能看不到此测试的很多(或任何)搜索结果。)

    全局搜索结果组件,突出显示“搜索词”字段

    如果对搜索结果的外观感到满意,请单击 社区标题中的“ 发布 ”。

    关于自动完成

    让我们稍微备份一下,甚至在您的社区成员进入搜索结果页面之前,谈论发生了什么。在社区中,他们还可以在搜索框中键入内容来获得搜索结果。

    键入搜索词时,搜索结果将显示在搜索框下方

    我们邀请您参加“全球搜索对等社区”组件,在其中可以设置一个称为“自动完成”的功能。当社区成员开始在搜索框中键入其搜索词时,自动完成功能会建议匹配的文章,讨论等。这有点像有一个朋友为您完成句子的一种有益的方式。它可以帮助用户更快地找到他们想要的东西。

    注意

    注意

    社区中还有两个其他自动完成组件。Search&Post Publisher是一个较旧的版本,下面我们将详细讨论。

    另一个名为“全局搜索框”的组件已针对不使用Chatter并希望将搜索集中于文章,主题和其他类型的Salesforce记录的社区进行了优化。由于大多数客户服务社区都使用Chatter,因此我们将重点关注此模块中的“全球搜索对等社区”组件。

    对等社区的全局搜索组件位于社区生成器中。要打开它,请将光标悬停在页面顶部的搜索框上,然后在出现蓝色边框时单击。首先,展开“自动完成搜索”部分。

    搜索框以蓝色突出显示,并打开“对等社区的全局搜索”组件

    如您所见,关于自动完成的内容很多。让我们逐步进行。

    第一个复选框很简单:使用它可以启用自动完成功能。它甚至可能已经被检查。干得好!

    对于其余的内容,让我们简化一下。让我们谈谈Capricorn咖啡对其社区的影响。可以将其视为订购咖啡师的特色菜。

    最大自动完成结果

    确定要在用户键入时显示多少个结果。Capricorn的默认设置为6。太多的结果可能会让人不知所措,而最相关的结果位于顶部,这里不需要太过疯狂。

    将自动完成搜索结果限制为讨论和文章

    Capricorn也希望社区成员也能看到其他对象的结果,因此无需检查。

    自动完成结果中的对象

    就像Capricorn Files在全局搜索结果组件中添加了文件一样,Capricorn也在此处添加了文件。

    全局搜索对等社区组件,为新添加的对象打开结果属性

    就像星期天早上滴下咖啡一样容易。

    如果您的社区使用“搜索和发布发布者”组件,则有两个选择。

    1. 升级到Winter ’18 Napili模板,该模板使用“对等社区的全局搜索”组件。请记住,新模板包括在更新之前可能要考虑的其他更改。
    2. 继续阅读以根据最佳做法设置“搜索和发布发布者”。

    要设置搜索和发布发布者,请转到生成器,然后单击搜索框。

    搜索框以蓝色突出显示,并且Search&Post Publisher组件打开

    选中复选框以在搜索中使用自动完成功能。然后:

    在一个列表中显示自动完成结果(1)

    选中此框,以便您的社区成员可以在一处看到其搜索词的所有匹配项。将鼠标悬停在不同的选项卡上比较麻烦,并且对于行动不便的社区成员而言可能很困难。

    结果排序(2)

    按相关性排序。此设置具有比眼睛更吸引人的效果。它不仅将最相关的结果放在列表的顶部,而且还允许您添加更多对象以自动完成。相比之下,“按对象分组”选项将自动完成结果限制为“文章和讨论”。

    最高自动完成结果(3)

    我们建议使用不超过10个。

    自动完成结果(4)

    按相关性排序。您可以在此处添加通过自动完成功能搜索的对象。单击 添加,然后单击新对象以在结果属性中对其进行更改。点击保存,一切顺利。

    在结果属性中将新添加的对象更改为Files对象

    您可能想知道我们如何确定哪些自动完成结果最相关。我们将“讨论和文章”放在列表的顶部,我们关注文章的观点和喜欢程度,以及是否有任何社区成员选择了答案作为最佳答案或给予了最高评价。

    其余结果根据我们在上一单元中讨论的因素进行排序。

    在Search&Post Publisher中完成编辑后,单击 社区标题中的Publish

    接下来,我们讨论您可以在社区中设置的一些其他搜索功能。

    在Salesforce社区中搜索

    学习目标

    完成本单元后,您将能够:

    • 描述为社区定制搜索的好处。
    • 列出可以帮助人们找到所需内容的搜索功能。
    • 说明如何按相关性排序搜索结果。

    介绍

    恭喜你!您的Salesforce社区是一个了不起的地方,您的客户可以与其他客户共享经验和专业知识,阅读知识库中的文章并解决他们自己的客户服务问题。当他们遇到棘手的难题需要特别注意时,他们可以轻松地与您的客户支持摇滚明星联系。您的社区甚至拥有您公司的品牌,因此每个人都感到宾至如归。

    为了您的努力,您已经获得了有权找到解决方案的客户。他们正在解决自己的潜在支持案例,每个人都很高兴。

    结束?当然不是!尽管我们热衷于庆祝您的成就,但是这将使您成为一个简短的Trailhead模块。您还会错过使用搜索使社区变得更好的一些方法。毕竟,如果您的客户找不到它们,那么拥有所有这些出色的资源毫无意义,对吗?

    搜索很棒,因为它可以使您的客户轻松地与社区交流。无论他们在哪个页面上,搜索框都位于顶部,可以将他们带到他们所需的信息。通过一些自定义,您可以帮助他们更快地到达目的地。自定义搜索可以节省时间,节省资金,并使您的客户满意。这也很容易。不去爱的种种?

    因此,让我们从基础开始。在本单元中,我们将讨论社区中搜索的工作方式。在下一个单元中,我们将介绍两种不同的搜索结果,以及如何充分利用它们。在本模块的后面,我们将介绍一些其他的自定义设置,这些设置可以将客户的搜索体验提升到一个新的水平。最后,我们讨论了如何使用搜索仪表盘中的数据来微调您的社区服务。

    我们可以通过我们最喜欢的公司之一Capricorn 咖啡的窗口查看所有这些信息。这家咖啡公司不仅烤咖啡豆,而且还在世界各地的咖啡馆出售世界一流的啤酒。该公司还建立了一个社区,以客户为中心。社区足够恰当地称为
    Capricorn啡馆。

    摩ri座咖啡馆的社区主页

    在Salesforce社区中搜索

    Capricorn 咖啡专门生产即使没有精美的设备或额外的配料也能带来极佳口感的产品。很自然地,Capricorn很高兴看到它的社区具有开箱即用的强大搜索功能。

    一方面,由于搜索无处不在,因此Capricorn的客户可以快速找到有关最佳磨豆机的文章,展示酿造技术的视频,以及有关如何获得最佳克丽玛奶酪的讨论。而且由于Capricorn的管理员已在社区中提供了Cases,因此客户还可以跟踪与Capricorn客户支持代表的互动。

    最好的部分是,Capricorn的客户在搜索时不需要确切知道他们在寻找什么。当然,他们会看到与其搜索词完全匹配的内容,但也会看到部分匹配项和接近的匹配项。最后,即使客户不知道自己需要什么,他们也可以得到他们需要的东西。

    搜索如何立即获得出色的结果

    在社区中,客户输入他们的搜索词并立即获得结果。但是实际上在那一瞬间发生了很多事情。以下是搜索在后台执行的一些操作,这些操作可以帮助客户找到所需的内容。合法化with,这与可爱的毛茸茸的旅鼠无关,但确实会使搜索更加可爱。词法化可以帮助用户找到单词的不同形式。例如,当摩羯座客户搜寻,搜索返回结果豆类。同样,对于搜索研磨也返回结果的研磨和 研磨。拼写校正此功能返回的结果与该术语的正确拼写匹配。因此,当客户不太确定如何拼写卡布奇诺咖啡或只是偶然键入fliter而不是filter时,这没什么大不了的(嘿,这确实发生了)。扩展查询如果搜索字词没有结果,则此功能将查找匹配项,该搜索字词是单词的一部分。例如,如果客户搜索mocha,则搜索还会返回mochaccino的结果。它还会寻找标点符号稍有不同的匹配项。AND /或搜寻当客户使用多个搜索词搜索知识文章时,我们首先运行AND搜索。例如,如果客户搜索法文印刷机,则我们首先查找同时包含法文印刷机的结果。如果找不到很多匹配项,则切换到OR搜索。这将返回包含French或 press的结果,从而为客户提供更多可能的匹配项供您选择。

    您是否注意到具有这些功能的主题(除了所有关于咖啡的话题)?在所有这些人中,搜索有助于扩大客户的结果网,因此他们不会丢下空杯子。

    最重要的是,这些功能都不需要设置。就像获得具有美味风味的速溶咖啡一样。

    相关搜索结果的相关性

    就像制作精美的卡布奇诺咖啡上的泡沫一样,正确的搜索结果也排在第一位。我们考虑以下几项内容,以决定将哪些结果放在搜索结果页面的顶部:

    • 搜索词出现在记录中的次数。(越多越好。)
    • 搜索词出现在哪些字段中。(名称,标题和主题字段很重要。)
    • 客户是否拥有记录。(我们假设客户希望首先看到他们拥有的产品。)
    • 客户查看或编辑记录的频率。(再一次,越多越好。)

    搜索结果还有更多相关因素,您可以在本文中了解有关搜索结果排序的因素。但也知道您,非常棒的管理员,对返回的结果有发言权!当您在社区中设置自动完成和同义词等搜索功能时,可以帮助将成员引导到他们所寻找的内容。作为管理员,您最了解客户是谁以及他们想要什么。

    想更多地了解搜索的工作原理?尝试使用“ 搜索解决方案基础知识”模块中的第一个单元。

    浏览示例应用程序并发现缓存诊断

    学习目标

    完成本单元后,您将能够:

    • 解释用于存储和刷新缓存数据的模式。
    • 确定用于缓存值的数据结构。
    • 诊断您的缓存使用情况。

    示例应用程序演练

    让我们看一个示例应用程序,该应用程序演示如何使用组织缓存来存储和检索货币汇率。汇率在一天内波动,因此该示例应用程序不会返回实时汇率。该应用程序只提供汇率的每日快照。因为我们对准确的实时价值不感兴趣,而只对日常价值感兴趣,因此缓存货币汇率是一个不错的选择。当重复检索汇率时,从缓存中获取汇率会节省大量时间并提高应用程序的性能。

    示例应用程序概述

    我们将我们的汇率样本申请基于Visualforce页面和Apex控制器,该控制器包含获取汇率的逻辑。第一次访问此页面时,速率是通过对外部Web服务的API调用获得的。只要费率低于一天,此页面的后续执行将从缓存中返回费率。对于每种汇率,此页面显示基础货币,转换的目标货币和转换率。出于说明目的,返回一小组货币。

    Visualforce页面显示货币汇率

    此示例是Visualforce页面的标记。此页面与ExchangeRates Apex控制器。

    <apex:page controller="ExchangeRates" action="{!init}">
        
       <apex:pageBlock title="Rates">
          <apex:pageBlockTable value="{!Rates}" var="rate">
             <apex:column value="{!rate.Base_Currency__c}"/>
             <apex:column value="{!rate.To_Currency__c}"/>
             <apex:column value="{!rate.Rate__c }"/>
          </apex:pageBlockTable>
       </apex:pageBlock>
       
    </apex:page>

    样品Apex控制器

    我们的样品Apex控制器可以完成繁重的工作。它获取汇率,将它们存储在Salesforce和缓存中,并从缓存中检索汇率。以下是样本控制器执行的操作细分,后跟源代码。

    第一次运行样本时,会发生以下操作。

    • 汇率是从对外部端点的API调用获得的。
    • 从API调用返回的结果(以JSON格式)将被解析并保存在Salesforce中的Exchange_Rate__c sObjects中。
    • 该 getCachedRates() method将Exchange_Rate__c sObjects数组存储在org缓存中。

    在随后的样本执行中:

    • 该示例检查存储数据的新鲜程度。为此,它执行SOQL查询以获取第一个返回的Exchange_Rate__c记录的createdDate值。
    • 如果日期早于一天,则从API调用获得汇率,与第一次执行时一样。
    • 如果日期早于一天,则费率将从组织缓存中获取。如果存在高速缓存未命中,则从Exchange_Rate__c sObject查询速率并将其存储在组织高速缓存中。
    注意

    注意

    Apex控制器使用一个名为的辅助Apex类 RateLib,这里没有显示。此帮助程序类包含用于对传输速率服务进行传出API调用,从API调用解析JSON结果以及存储Exchange_Rate__c记录的方法。

    public class ExchangeRates {
        private String currencies = 'EUR,GBP,CAD,PLN,INR,AUD,SGD,CHF,MYR,JPY,CNY';
        public String getCurrencies() { return currencies;}
        public Exchange_Rate__c[] rates {get; set;}
        //                                                                          
        // Checks if the data is old and gets new data from an external web service 
        // through a callout. Calls getCachedRates() to manage the cache.           
        // 
        public void init() {
            // Let's query the latest data from Salesforce
            Exchange_Rate__c[] latestRecords = ([SELECT CreatedDate FROM Exchange_Rate__c 
                            WHERE Base_Currency__c =:RateLib.baseCurrencies 
                                  AND forList__c = true 
                            ORDER BY CreatedDate DESC
                            LIMIT 1]);
            
            // If what we have in Salesforce is old, get fresh data from the API
            if ( latestRecords == null  
                || latestRecords.size() == 0 
                || latestRecords[0].CreatedDate.date() < Datetime.now().date()) {
                // Do API request and parse value out
                String tempString = RateLib.getLoadRate(currencies);
                Map<String, String> apiStrings = RateLib.getParseValues(
                    tempString, currencies);
                
                // Let's store the data in Salesforce
                RateLib.saveRates(apiStrings);
                // Remove the cache key so it gets refreshed in getCachedRates()
                Cache.Org.remove('Rates');
            }
            // Call method to manage the cache
            rates = getCachedRates();
        }
        //                                                                          
        // Main method for managing the org cache.                                  
        // - Returns exchange rates (Rates key) from the org cache.                 
        // - Checks for a cache miss.                                               
        // - If there is a cache miss, returns exchange rates from Salesforce       
        //    through a SOQL query, and updates the cached value.                   
        //
        public Exchange_Rate__c[] getCachedRates() {
            // Get the cached value for key named Rates
            Exchange_Rate__c[] rates = (Exchange_Rate__c[])Cache.Org.get(
                RateLib.cacheName+'Rates');
            
            // Is it a cache miss? 
            if(rates == null) {
                // There was a cache miss so get the data via SOQL
                rates = [SELECT Id, Base_Currency__c, To_Currency__c, Rate__c 
                            FROM Exchange_Rate__c 
                            WHERE Base_Currency__c =:RateLib.baseCurrencies 
                                  AND forList__c = true
                                  AND CreatedDate = TODAY];
                // Reload the cache
                Cache.Org.put(RateLib.cacheName+'Rates', rates);
            }
            return rates;
        }
    }

    要下载Exchange Rate示例的来源并在Developer org中使用它,请参阅参考资料部分。

    缓存管理的最佳实践

    缓存存储的模式

    该 ExchangeRatesApex类包含封装初始化和刷新缓存的逻辑的方法。如果数据陈旧或未找到,则在里面()method通过API调用检索新的汇率,然后将它们存储在Salesforce中。该getCachedRates()方法在内部管理缓存。如果未找到缓存值,则此方法从Salesforce检索一组速率并将其存储在缓存中。

    由于我们的应用程序使用外部数据,因此它通过API调用从Web服务获取数据。它还将数据存储为Salesforce记录,作为刷新缓存的备份。不使用外部数据的应用程序使用SOQL检索Salesforce记录并对其进行缓存。在这种情况下,缓存管理过程更简单,缓存方法实现更短。例如,如果您的应用只使用SOQL中的本地数据,则不需要在里面() 方法,但只有 getCachedRates() 方法。

    我们建议您在一种方法中包含用于管理缓存的所有逻辑。这样,缓存仅在应用程序的一个位置进行操作。高速缓存的集中管理减少了访问无效高速缓存(高速缓存未命中)或意外覆盖高速缓存值的错误的可能性。

    决定缓存什么

    此示例将一个sObjects数组存储在缓存中。这种方法是存储数据结构的最佳选择吗?你做出的每一个选择都有权衡。存储较小的数据片段(如字段值而不是整个sObject)可以减少缓存使用量。但是,如果在每个键中存储的数据较少,则可能需要复杂的逻辑来重建数据和sObject,这需要更多的处理时间。并且存储在一个键中的sObject数组使用的缓存空间少于存储在各个键中的各个sObject的总大小。由于序列化和缓存提交时间的开销,缓存较小的项而不是项列表会降低缓存性能。例如,

    Cache.Org.put('Rates', rates);

    您可以将各个费率存储为具有自己的缓存键的字段,如下所示。

    Cache.Org.put('DollarToEuroRate', rateEUR);
    Cache.Org.put('DollarToChineseYuan', rateCNY);
    Cache.Org.put('DollarToJapaneseYen', rateJPY);
    // etc.

    决定缓存哪种数据结构取决于您的应用程序对数据的处理方式。例如,如果应用程序转换相同基础货币的货币,则至少存储每种目标货币的汇率。您可以将每种货币汇率存储为单个键。但是为了更容易在Visualforce页面上显示费率,请将数据缓存为sObject列表。sObjects可以增加存储空间,因为它们包含系统字段,例如创建的日期,但它们减少了逻辑处理时间并提高了应用程序和缓存性能。请记住,在使用缓存时,主要目标是减少应用程序的执行时间。

    诊断缓存使用情况

    所以,你已经完成了所有这些工作来实现Platform Cache。你怎么知道你是否正在充分利用缓存?有几种方法可以检查性能数据。一种方法是在Setup中查看诊断信息(仅在Salesforce Classic中可用)。

    在访问诊断页面之前,请为您的用户启用缓存诊断权限。

    1. 从“设置”中,输入users“ 快速查找”框,然后选择“ 用户”
    2. 单击您的用户名,然后单击“ 编辑”
    3. 选择“ 缓存诊断”,然后单击“ 保存”

    接下来,访问分区中特定缓存类型的诊断页面。

    1. 从“设置”中,输入cache“ 快速查找”框,然后选择“ 平台缓存”
    2. 单击要检查其诊断信息的分区。
    3. 在会话缓存或组织缓存下,单击“ 诊断”

    如果单击“组织缓存”的“ 诊断”,则会在新选项卡中打开“组织缓存诊断”页面。此页面显示两个图表。第一个图表(组织缓存容量和使用情况)显示您的缓存使用限制。在我们的例子中,我们低于极限0.02%。第二个图表(按内容贡献)是一个圆环图,按键显示缓存分布。

    注意

    注意

    因为我们的示例使用org缓存,所以我们只检查诊断页面中的org缓存。还为使用会话高速缓存的应用程序的会话高速缓存提供了类似的诊断页面。

    下图显示了包含四个缓存键的内容分发图表。其中一个缓存键Rate用于我们的汇率样本。该 价格键更采用了比空间的一半。

    组织缓存的诊断页面

    在图表之后,列出了缓存键的详细信息。此列表提供与密钥对应的每个缓存值的大小以及访问缓存的次数。您可以从此列表中手动删除缓存,作为调用该缓存的替代方法去掉()Apex中的方法。“ 删除”按钮允许管理员在不修改任何代码的情况下管理缓存。

    该DollarToEuroRate键使用比少得多的空间 价格的关键。这是可以预料的,因为 DollarToEuroRate只存储一个值,而 Rates存储一组sObjects。

    使用诊断页面上的信息确定是否调整缓存使用情况。例如,如果缓存值具有较低的访问计数,表明它很少使用,请考虑它是否真的需要,特别是如果它很大。或者,如果您接近缓存使用限制,请重新考虑缓存内容。您可能希望删除不必要的缓存值或购买更多缓存容量。

    恭喜!您已经学习了如何使用Platform Cache来缓存应用程序的数据以便快速检索。您还了解了缓存最佳实践以及如何诊断缓存使用情况。您现在已准备好加入花栗鼠的冒险并缓存宝贵的资源!

    使用组织和会话缓存

    学习目标

    完成本单元后,您将能够:

    • 创建一个分区。
    • 在组织和会话缓存中存储和检索值。
    • 描述缓存中的值的持续时间。
    • 处理缓存未命中。
    • 从Visualforce页面读取会话缓存。

    创建分区

    注意

    注意

    还没有缓存试用版吗?此单元需要有效的Platform Cache试用版。使用上一个单元中的说明申请试用。如果您没有缓存试用版,则仍可以执行本机中的步骤,但不会在缓存中找到您的数据。

    要使用Platform Cache,首先要设置至少一个分区。设置分区后,您可以使用Platform Cache Apex API添加,访问和删除数据。

    每个分区都有一个会话缓存和一个组织缓存段。您可以为每个段分配单独的容量。通常,您为分区分配至少5 MB。对于此示例,我们不分配任何空间以确保您的代码正确处理缓存未命中。当没有分配空间时,缓存未命中率为100%,这意味着在缓存中找不到缓存值,并且得到() 方法返回 空值。考虑使用此技术来测试缓存未命中。我们将在后面的部分介绍如何处理缓存未命中。

    首先,让我们从Platform Cache页面创建一个分区(仅在Salesforce Classic中可用)。

    1. 在“设置”中,输入Platform Cache“ 快速查找”框,然后选择“ 平台缓存”
    2. 单击“ 新建平台缓存分区”
    3. 为分区指定名称(例如应用程序的名称)。
    4. 检查默认分区
    5. 输入0会话缓存和0组织缓存,然后单击“ 保存”

    缓存密钥名称格式

    每个缓存键具有以下格式:

    Namespace.Partition.Key

    名称空间是运行应用程序的组织的名称空间名称,也可以设置为特殊名称“local”。“本地”名称是指组织的名称空间是否在组织中定义了名称空间。

    分区是您创建的分区的名称。在此示例中,它是CurrencyCache。

    Key是用于存储值的键的名称。键名唯一地表示您的缓存值。

    假设我们想将货币汇率从美元存储到欧元。我们可以创建一个名为DollarToEuroRate的密钥。对于我们刚刚创建的分区,密钥的全名是:

    local.CurrencyCache.DollarToEuroRate

    例如,此代码段存储了DollarToEuroRate键的组织缓存中的值。

    Cache.Org.put('local.CurrencyCache.DollarToEuroRate', '0.91');

    我们创建的分区是默认分区,因此您可以省略命名空间和分区名称,只需指定密钥名称即可。

    DollarToEuroRate

    使用默认分区时,可以将put()调用缩短为以下内容。

    Cache.Org.put('DollarToEuroRate', '0.91');

    在组织缓存中存储和检索数据

    您已完成设置分区,这是您在用户界面中执行的唯一步骤。现在我们将切换到Apex来管理缓存。使用组织缓存来存储组织中任何人都可以使用的数据。要么使用Cache.Org 类方法,或使用 Cache.OrgPartition用于引用特定分区的类。然后调用该分区上的缓存方法。

    以下Apex代码段显示了如何使用。访问分区 Cache.OrgPartition用于存储和检索货币兑换应用程序的缓存值的类。它在本地名称空间中获取名为CurrencyCache的分区。使用关键的DollarToEuroRate和今天的货币汇率添加新值 。接下来,从缓存中检索关键DollarToEuroRate的值。

    // Get partition
    Cache.OrgPartition orgPart = Cache.Org.getPartition('local.CurrencyCache');
    // Add cache value to the partition. Usually, the value is obtained from a 
    // callout, but hardcoding it in this example for simplicity.
    orgPart.put('DollarToEuroRate', '0.91');
    // Retrieve cache value from the partition
    String cachedRate = (String)orgPart.get('DollarToEuroRate');

    如果您只在一个分区中管理缓存值,请使用 Cache.OrgPartition方法。该Cache.OrgPartition 方法比使用起来更容易 Cache.Org 方法,因为在创建分区对象时只指定了一次命名空间和分区前缀。

    缓存价值最后一次?

    前面的例子假设一切正常,即:

    • 平台缓存已启用,并具有可用空间的分区
    • 缓存中的缓存值
    • 该值已成功存储在缓存中

    但在现实生活中,缓存数据并不总能得到保证。平台缓存旨在作为临时空间。例如,缓存可能已过期。即使缓存仍处于活动状态,您的缓存数据也可能会从缓存中逐出。就像花栗鼠清理他们的脸颊以腾出更多橡子的空间一样,Platform Cache也可以清除一些空间以获得更多数据!超出分区限制时,Salesforce会根据最近最少使用(LRU)算法驱逐缓存数据。高速缓存逐出直到使用减少到小于或等于100%容量。此外,如果超出本地缓存限制,则可以在提交请求之前从本地缓存中逐出项目。

    缓存数据持续时间和到期时间

    数据保存在缓存中的时间称为生存时间值(ttlsecs)。使用Apex方法在缓存中存储键值对时,可以指定生存时间值。对于会话缓存,您的数据最多可在缓存中保存8小时。对于组织缓存,您的数据最多可在缓存中运行48小时。默认情况下,组织缓存的生存时间值为24小时。

    会话缓存在达到其指定的生存时间值或用户会话到期时(以先到者为准)到期。组织缓存在达到其指定的生存时间值时到期。

    处理缓存未命中的最佳实践

    作为最佳实践,您的代码应该预见并容纳故障点。换句话说,始终假设可能发生缓存未命中。缓存未命中是指从缓存中请求密钥值但未找到值的情况。你的价值 得到()call returns为null。检查结果得到()调用null并相应地处理它。例如,如果结果是空值,从数据库或API调用中获取值。

    以下Apex代码段显示了如何通过检查缓存中返回的值是否来处理缓存未命中 空值 (if(cachedRate!= null))。如果值不是空值,您可以使用该值,例如,在页面上显示它。否则,从其他源(例如API调用或Salesforce)获取此值。

    Cache.OrgPartition orgPart = Cache.Org.getPartition('local.CurrencyCache');
    String cachedRate = (String)orgPart.get('DollarToEuroRate');
    // Check the cache value that the get() call returned.
    if (cachedRate != null) {
        // Display this exchange rate   
    } else {
        // We have a cache miss, so fetch the value from the source.
        // Call an API to get the exchange rate.
    }

    在会话缓存中存储和检索数据

    还记得什么会话缓存吗?没错,它存储与各个用户会话相关的数据。例如,您可以在应用程序中使用会话缓存来存储用户喜欢的货币或用户的自定义导航选项卡顺序。使用会话缓存,您可以使用Visualforce全局变量管理Apex中的缓存值并读取缓存值。

    使用Apex时,管理会话缓存与管理组织缓存的方式类似,但类名不同。使用Cache.Session 和 Cache.SessionPartition用于访问存储在会话高速缓存中的值的类。要管理任何分区中的值,请使用中的方法Cache.Session 类。如果您只在一个分区中管理缓存值,请使用Cache.SessionPartition方法而不是。该Cache.SessionPartition 方法比使用起来更容易 Cache.Session 方法,因为在创建分区对象时只指定了一次命名空间和分区前缀。

    以下的Apex代码片段显示了如何访问分区以存储和检索缓存值。它在本地名称空间中获取名为CurrencyCache的分区。使用关键的FavoriteCurrency添加新值。检索FavoriteCurrency密钥的值 。该 FavoriteCurrency密钥存储用户的喜爱货币,所以这个值是为每个用户,因此一个很好的候选人会话缓存不同。

    // Get partition
    Cache.SessionPartition sessionPart = Cache.Session.getPartition('local.CurrencyCache');
    // Add cache value to the partition
    sessionPart.put('FavoriteCurrency', 'JPY');
    // Retrieve cache value from the partition
    String cachedRate = (String)sessionPart.get('FavoriteCurrency');

    使用Visualforce全局变量访问平台缓存

    通过使用,从Visualforce页面访问存储在平台缓存中的缓存值 $ Cache.Session 要么 $ Cache.Org全局变量。通过使用这些全局变量,您可以直接从Visualforce页面读取与Apex一起存储的缓存值。

    注意

    注意

    以下示例显示如何使用。访问会话高速缓存 $ Cache.Session全局变量。除了使用之外,等效的org缓存示例是相同的$ Cache.Org 而是全局变量。

    使用时 $ Cache.Session全局变量,使用命名空间和分区名称完全限定密钥名称。此示例是一个输出文本组件,用于从命名空间中检索缓存的值艾博, 划分 CurrencyCache和关键 FavoriteCurrencyRate。

    <apex:outputText value="{!$Cache.Session.ExPro.CurrencyCache.FavoriteCurrencyRate}"/>

    与Apex方法不同,您不能省略 namespace.partition前缀以引用组织中的默认分区。如果没有为组织定义名称空间,请使用本地 引用运行代码的当前组织的命名空间。

    <apex:outputText value="{!$Cache.Session.local.MyPartition.Key}"/>

    如果缓存的值是具有属性或方法的数据结构,如Apex List或自定义类,则访问这些属性 $ Cache.Session表达式使用点表示法。例如,此标记调用则为list.size() 如果是Apex方法的值 numbersList 被声明为List。

    <apex:outputText value="{!$Cache.Session.local.MyPartition.numbersList.size}"/>

    此示例访问on上的value属性 MYDATA的 声明为自定义类的缓存值。

    <apex:outputText value="{!$Cache.Session.local.MyPartition.myData.value}"/>

    ISV应用程序的受保护缓存分配

    通过使用平台缓存,ISV应用程序运行速度更快,性能更佳。如果您是ISV开发人员,则可以通过为自己的命名空间购买缓存空间来保证应用程序的缓存空间。这样,当您的应用安装在订阅者组织中时,应用缓存的空间不会受到订阅者组织中缓存使用的影响。只有从应用程序命名空间运行的Apex代码才能访问和使用命名空间的缓存。订阅者组织中没有其他代码可以使用此缓存。您可以根据命名空间的缓存测试您的应用程序,并确保缓存分配将在每个订阅者组织中受到保护。

    缓存分区作为应用程序包的一部分分发给订阅者。将命名空间的一个或多个缓存分区作为组件添加到包中,方法与添加其他组件相同。缓存分区不会自动添加为依赖组件。

    包含缓存分区的包组件列表
    注意

    注意

    请参阅以下有关打包分区的信息

    • 您添加到程序包的分区必须是非默认分区。
    • 当订户安装您的软件包时,缓存分区将安装在其组织中,使您的应用程序可以访问您的命名空间的已安装缓存分区。
    • 订阅者必须拥有Enterprise Edition或Unlimited Edition组织,或者必须购买Platform Cache。

    下图显示了使用打包缓存安装软件包的Enterprise Edition订户组织的示例缓存容量。订户的总缓存容量为30 MB,分为三个分区,包括会话和组织缓存的组合。打包的缓存容量来自订户组织中已安装的包,并包含两个分区。打包的缓存由ISV购买的20 MB缓存组成。(请记住,只有包中的Apex代码才能访问打包的缓存,订阅者组织中的代码无法使用此缓存。)

    打包分区和组织分区的缓存容量是分开的

    从Channel Order App购买命名空间缓存。您可以购买10 MB块的缓存。要确定应用程序需要多少缓存空间,请使用缓存分区测试应用程序。使用试用缓存来增加组织中缓存的容量。正如我们在第一个单元中提到的,默认情况下,某些版本的订户组织会获得缓存分配。对于开发应用程序的Developer Edition组织,您可以请求10 MB的试用缓存。您可以通过联系Salesforce请求增加为您的组织提供的试用缓存数量。通过尝试不同的缓存大小,您可以更好地了解为自己的命名空间购买多少缓存。

    现在您已经了解了如何在Platform Cache中获取和存储值,请自行尝试!完成以下挑战以测试您的知识。

    开始使用Platform Cache

    学习目标

    完成本单元后,您将能够:

    • 描述什么是平台缓存以及它的用途。
    • 列出两种类型的平台缓存并给出每种缓存的示例。
    • 描述分区以及如何使用它们。

    什么是缓存?

    缓存是临时存储。在计算机世界中,缓存是来自数据库的频繁访问数据的临时存储。这是一个类比。假设你是一只寻找坚果和橡子的花栗鼠。现在是5点,你准备好吃了。你打算使用存放在你脸颊上的坚果和橡子(缓存),还是你要回到森林里从树上收集更多(数据库)?如果您在脸颊上访问食物的临时缓存,您的晚餐会更接近,您可以更快地吃到它!此外,您可以更有效地实现目标。数据缓存具有类似的优点,但对于人而言,不是花栗鼠。

    一种花栗鼠,脸颊上有坚果

    什么是平台缓存?

    Platform Cache是​​一个存储层,用于存储Salesforce会话和组织数据以供以后访问。使用Platform Cache时,您的应用程序可以更快地运行,因为它们将可重用数据存储在内存中。应用程序可以快速访问此数据; 他们不需要在后续事务中复制计算和对数据库的请求。简而言之,将Platform Cache视为云应用程序的RAM。

    使用Platform Cache,您还可以分配缓存空间,以便某些应用程序或操作不会窃取其他人的容量。您使用分区来分配空间。我们稍后会进入分区。

    在我们继续前进之前

    让我们暂停一下,请求试用平台缓存。默认情况下,您的Developer org具有0 MB缓存容量。您可以请求10 MB的试用缓存。

    要申请试用,请转到开发人员组织中的“设置”。在“ 快速查找”框中,输入cache,然后单击“ 平台缓存”。单击“ 请求试用容量”并等待电子邮件通知您平台缓存试用版处于活动状态。Salesforce立即批准试用请求,但您可能需要几分钟才能收到电子邮件。

    请求“平台缓存”页面上的“试用容量”按钮

    如果您没有缓存试用版,则仍可以执行缓存操作以了解如何使用缓存。但是,会绕过缓存存储,并且检索的值为空(缓存未命中)。

    好的,既然您已经请求了Platform Cache试用版,那么让我们学习更多概念。

    我什么时候可以使用平台缓存?

    您可以在代码中使用平台缓存,几乎可以在任何地方反复访问相同的数据。使用缓存数据可以提高应用程序的性能,并且比重复执行SOQL查询,进行多个API调用或计算复杂计算更快。

    要缓存的最佳数据是:

    • 在整个会话中重用,或在所有用户和请求中重用
    • 静态(不会快速变化)
    • 计算或检索费用昂贵

    存储不经常更改的数据

    使用缓存来存储不经常更改的静态数据或数据。该数据最初通过来自第三方的API调用或通过SOQL查询在本地检索。如果数据发生更改,请在不必始终高度准确的情况下缓存此数据。

    此类静态数据的示例如下:

    • 公共交通时刻表
    • 公司班车时刻表
    • 所有用户都看到的标题页眉
    • 显示在应用的每个页面上的静态导航栏
    • 您希望在会话期间保留的用户购物车
    • 每日汇率快照(汇率在一天内波动)

    存储从复杂计算中获得的数据

    由复杂计算或长查询产生的值是缓存存储的良好候选者。此类数据的示例如下:

    • 过去一周的总销售额
    • 公司员工整体志愿服务时间总计
    • 最畅销的排名

    有关使用Platform Cache的位置的线索,请检查您的代码。例如,您当前是否通过重载Visualforce视图状态来存储应用程序数据?这些存储的值都是Platform Cache的候选者。

    并非每个用例都是Platform Cache用例。例如,经常更改且实时更改的数据(例如股票报价)不适合缓存。此外,请确保您熟悉Platform Cache限制。例如,如果您的数据由异步Apex访问,则无法将其存储在基于用户会话的缓存中。

    按版本缓存分配

    具有Enterprise Edition orgs及更高版本的客户可以使用Platform Cache。以下版本带有一些默认缓存空间,但通常情况下,添加更多缓存可提供更高的性能增强。

    • 企业版(默认为10 MB)
    • 无限版(默认为30 MB)
    • 性能版(默认为30 MB)

    试用试用缓存

    您可以为您的组织购买额外的缓存。要确定多少额外缓存对您的应用程序有益,您可以请求试用缓存并进行试用。此外,在购买缓存之前请求专业版的试用缓存。在Developer Edition组织中使用试用缓存来使用Platform Cache开发和测试您的应用程序。当您的请求获得批准后,您将获得30 MB的试用缓存空间(Developer Edition为10 MB)。如果您需要更多试用缓存空间,请联系Salesforce。

    平台缓存的类型是什么?

    平台缓存有两种类型:组织缓存和会话缓存。

    组织缓存

    组织缓存存储组织中任何人都可以使用的组织范围数据。可以跨会话,请求和组织用户和配置文件访问组织缓存。

    例如,可以根据联系人的位置为联系人缓存和显示天气数据。或者可以缓存货币汇率的每日快照以便在应用中使用。

    会话缓存

    会话缓存存储单个用户的数据,并与该用户的会话相关联。会话的最长寿命为8小时。

    例如,假设您的应用计算用户位置与用户希望在同一天访问的所有客户之间的距离。位置和计算的距离可以存储在会话高速缓存中。这样,如果用户想要再次获得该信息,则不需要重新计算距离。或者,您可能拥有一个应用程序,使用户可以自定义导航标签顺序,并在访问应用程序中的其他页面时重复使用该顺序。

    使用缓存时性能提升了多少?

    您可能想知道使用Platform Cache可以提高应用程序的性能。从缓存中检索数据比通过API调用快得多。将SOQL与缓存检索时间进行比较时,缓存也比SOQL查询快得多。

    下图显示了通过API调用和缓存的数据检索时间(以毫秒为单位)。在通过缓存本地获取数据时,很容易注意到巨大的性能提升,尤其是在多个事务中检索数据时。在用于图表的示例中,缓存比API调用快数百倍。在此图中,缓存检索时间仅为几毫秒,但由于用于时间值的比例,因此几乎为零。请注意,此图表是一个示例测试,其他应用的实际数字可能会有所不同。对外部服务进行API调用比从缓存中获取数据(2)更慢(1)。

    Graph将API调用的处理时间与缓存进行比较

    下一个图表将SOQL与组织和会话缓存检索时间进行比较。如您所见,SOQL比缓存慢。在此示例中,缓存比SOQL快两倍或更多倍,以便在单个事务中进行数据检索。在多个事务中执行检索时,差异甚至更大。(请注意,此图表是一个示例,其他应用的实际数字可能会有所不同。)通过SOQL查询获取数据(1)比从组织和会话缓存中获取数据要慢(2)。

    Graph将SOQL查询的处理时间与缓存进行比较

    什么是缓存分区?

    还记得我们之前提到过使用Platform Cache你可以使用分区分配空间吗?我们现在谈谈分区。分区允许您分配缓存空间以平衡跨应用程序的使用情况和性能。将数据缓存到指定的分区可确保缓存空间不会被其他应用程序或不太重要的数据覆盖。

    在组织中使用缓存空间之前,必须创建分区以定义应用程序的容量。每个分区容量在组织缓存和会话缓存之间分解。会话和组织缓存分配可以是零,5 MB或更大,并且必须是整数。分区的最小大小(包括其组织和会话高速缓存分配)为5 MB。例如,假设您的组织总共有10 MB的缓存空间,并且您创建了一个总共5 MB的分区,其中5 MB用于会话缓存,0 MB用于org缓存。或者,您可以创建10 MB空间的分区,其中5 MB用于组织高速缓存,5 MB用于会话高速缓存。所有分区的总和(包括默认分区)等于Platform Cache总分配。

    下图显示了缓存容量和分区分配的图表。在这个例子中,我们还没有使用缓存,正如0%缓存使用情况(1)所证明的那样,并且已经使用相等的分配创建了两个分区(2)。

    缓存容量图表

    默认分区

    您可以将任何分区定义为默认分区,但只能有一个默认分区。默认分区使您可以使用简写语法在该分区上执行缓存操作。这意味着在添加键值对时,您不必使用命名空间和分区名称完全限定键名。例如,而不是呼叫Cache.Org.put(’namespace.partition.key’,0); 你可以打电话 Cache.Org.put(’key’,0);

    在下一个单元中,您将在安装程序中创建一个分区,以便开始使用Platform Cache!

    Big Objects-查询

    学习目标

    完成本单元后,您将能够:

    • 使用标准SOQL查询大对象。
    • 使用Async SOQL查询大对象。
    • 列出使用Async SOQL而非标准SOQL的优缺点。

    SOQL和异步SOQL

    可以使用SOQL或Async SOQL查询大对象。异步SOQL使用SOQL命令的子集。它是从头开始设计的,用于处理可以保存在大对象中的大量数据。由于异步SOQL查询是异步运行的,因此您不必担心查询超时。异步SOQL查询在后台运行,可以在Salesforce实体数据,标准对象,自定义对象和大对象上运行。异步SOQL通过Chatter REST API实现。

    通常,当您处理大量数据时,您希望使用Async SOQL而不是标准SOQL。如果您只需要来自大对象的小数据集,或者如果您需要立即获得结果,请使用标准SOQL。异步SOQL也适用于标准和非大型自定义对象,但对这些对象的支持处于试用阶段。

    请记住,虽然每个许可证都包含自定义大对象,但Async SOQL仅包含额外大对象容量的许可。在以下时间使用标准SOQL:

    • 您希望在UI中显示结果,而无需用户等待结果。
    • 您希望立即返回结果以便在Apex代码块中进行操作。
    • 您知道查询将返回少量数据。

    在以下情况下使用Async SOQL:

    • 您正在查询数百万条记录。
    • 您希望确保查询完成。
    • 您不需要在索引之外进行聚合查询或过滤。
    异步SOQL用例。

    简而言之,Async SOQL允许您在大对象中获取数百万条记录,并将相关数据提取到可管理的工作数据集中。

    如何使用SOQL查询大对象

    如果您已经熟悉使用SOQL,那么您会感到宾至如归。使用标准SOQL时需要注意的事项与使用SOQL和非大对象的大对象不同。对于具有大对象的SOQL查询,您必须从索引中定义的第一个字段开始构建查询,而不跳过查询中第一个和最后一个字段之间的任何字段。因此,例如,如果索引定义了三个字段,则无法仅使用第一个和第三个字段创建查询。

    您可以使用这些比较运算符 =, <, >, <=, > =, 要么 在在查询的最后一个字段上。查询中的任何先前字段只能使用=运营商。该!=, 喜欢, 不在, 排除,和 INCLUDES 运算符在涉及大对象的任何查询中都无效。

    以下查询假定您有一个大对象,其中索引由其定义 Account__c, Game_Platform__c,和 Play_Date__c。此查询指定索引中的所有三个字段。在这种情况下,过滤器Play_Date__c 可以是一个范围。

    SELECT Account__c, Game_Platform__c, Play_Date__c
    FROM Customer_Interaction__b
    WHERE Account__c='001R000000302D3' AND Game_Platform__c='PC' AND Play_Date__c=2017-09-06T00:00:00Z

    查询不起作用,因为查询中的间隙在哪里 Game_Platform__c 应该。

    SELECT Account__c, Game_Platform__c, Play_Date__c
    FROM Customer_Interaction__b
    WHERE Account__c='001R000000302D3' AND Play_Date__c=2017-09-06T00:00:00Z

    如何使用异步SOQL查询大对象

    有两种主要方法可以使用Async SOQL从大对象中获取可管理的数据集。首先是使用过滤。您可以使用过滤将大对象数据的一小部分提取到自定义对象中。然后,您可以在报告,仪表板或其他漂亮的分析工具中使用它。

    创建可管理数据集的另一种方法是通过粗略聚合。这些是Async SOQL支持的聚合函数:AVG( field ), COUNT( field ), COUNT_DISTINCT( field ), SUM( field ), MIN( field ), MAX( field )。这些聚合函数可以更好地控制从大对象中提取的数据。

    形成您的查询

    使用Async SOQL,我们查询自定义大对象 Customer_Interaction__b,并将结果指向我们的目标对象 TargetObject__c。我们将特定日期的帐户和游戏内购买信息从我们的自定义大对象提取到目标对象,然后我们可以将其用于报告和分析。必填字段

    名称类型描述
    询问字符串指定要执行的SOQL查询的参数。
    targetObject字符串要插入查询结果的标准对象,自定义对象,外部对象或大对象。
    targetFieldMapMap <String,String>定义如何将查询结果中的字段映射到目标对象中的字段。定义时 targetFieldMap 参数,确保字段类型映射是一致的。如果源字段和目标字段不匹配,则适用这些注意事项。任何源字段都可以映射到目标文本字段。如果源和目标字段都是数字,则目标字段必须具有与源字段相同或更多的小数位数。如果不是,则请求失败。此行为是为了确保转换中不会丢失任何数据。如果查询结果中的字段被多次映射,即使映射到目标对象中的不同字段,也只使用最后一个映射。

    示例URI

    https://yourInstance.salesforce.com/services/data/v41.0/async-queries/

    POST请求正文

    { 
       "query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",
       
       "operation": "insert",
       
       "targetObject": "Customer_Interaction_Analysis__c", 
            
       "targetFieldMap": {"Account__c":"Account__c",
                          "In_Game_Purchase__c":"Purchase__c"
                          },
       "targetValueMap": {"$JOB_ID":"BackgroundOperationLookup__c",
                          "Copy fields from source to target":"BackgroundOperationDescription__c"
                         }
    }

    在此查询中,我们从特定日期2017-09-06获取客户交互大对象的帐户和游戏内购买信息,并将该数据发送到我们创建的自定义对象中, Customer_Interaction_Analysis__c。因为我们使用的是Async SOQL而不是标准的SOQL,所以我们可以过滤而不必担心包含其他索引字段。此新自定义对象将填充该日期的所有帐户和游戏内购买信息。从那里我们可以开始做一些分析,并试图找出为什么我们的游戏是如此惊人的成功。

    POST响应机构响应正文包括查询 的jobId,查询的状态以及任何相关消息。

    { 
       "jobId": "08PD000000003kiT", 
       
       "message": "",
        
       "query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",  
        
       "status": "New",
         
       "targetObject": "Customer_Interaction_Analysis__c", 
         
       "targetFieldMap": {"Account__c":"Account__c", 
                          "In_Game_Purchase__c":"Purchase__c"
                         },
       "targetValueMap": {"$JOB_ID":"BackgroundOperationLookup__c",
                          "Copy fields from source to target":"BackgroundOperationDescription__c"
                         } 
    }
    

    跟踪您的查询状态

    要跟踪查询的状态,请指定它 JOBID使用HTTP GET请求。查询的状态在。中返回状态领域。如果你没有指定JOBID,我们返回所有查询的状态。该状态 可:

    • 取消- 工作在被运行之前被取消了。
    • 成功- 工作顺利完成。
    • 失败 – 系统提交后作业失败,或者请求超出了Async SOQL限制。消息字段提供有关失败原因的详细信息。
    • 运行- 工作成功运行,组织未超出任何限制。
    • 计划- 新作业已创建并已安排,但尚未运行。

    您也可以通过指定HTTP DELETE请求来取消查询 的jobId。取消已完成的查询无效。

    请记住,异步SOQL是异步完成的。这意味着您的查询可能需要一段时间才能完成。就像我们之前提到的那样,如果时间紧迫,并且数据集足够小,请使用标准SOQL。或者,我们可以想象一下在这些例子中使用的不那么受欢迎的虚构游戏,但那里的乐趣在哪里呢?示例URI

    https://yourInstance.salesforce.com/services/data/v41.0/async-queries/08PD000000003kiT

    示例GET响应

    {
    "jobId": "08PD000000003kiT",
    "message": "",
    "query": "SELECT Account__c, In_Game_Purchase__c FROM Customer_Interaction__b WHERE Play_Date__c=2017-09-06T00:00:00Z",  
    "status": "Success",
    "targetObject": "Customer_Interaction_Analysis__c",
    "targetFieldMap": {"Account__c":"Account__c",
    "In_Game_Purchase__c":"Purchase__c" } 
    }

    此响应显示我们的查询已成功完成。哇噢!是时候准备报告和仪表板了!

    处理错误

    在执行Async SOQL查询期间可能会发生两种不同类型的错误。

    • 查询执行中的错误
    • 将结果写入目标大对象的一个​​或多个错误

    提交无效查询并超出其中一个异步SOQL限制是执行问题的示例。另一个示例是查询导致底层基础结构出现问题。对于这些错误,响应正文包含状态 失败。message参数提供有关失败原因的更多信息。

    其他时候,查询成功执行但在尝试将结果写入目标对象时遇到错误。由于涉及的数据量很大,捕获每个错误都是低效的。相反,生成的错误的子集被捕获 BackgroundOperationResult对象并保留七天。您可以使用Async SOQL查询来查询此对象的jobId过滤特定Async SOQL查询的错误。异步SOQL作业信息保留一年。

    把它包起来

    现在您了解在您自己的组织中使用自定义大对象所需的一切。哈哈,现在有数十亿条记录。

    我们只是触及了Async SOQL的表面。请务必查看资源部分,以查看Async SOQL支持的所有标准SOQL命令以及更多用例示例。您还可以找到有关可在POST请求中使用的可选字段的信息。另请参阅我们的Analytics数据集成基础知识模块,了解如何为从大对象中提取的数据设置分析。想想您可以使用所有数据制作的所有漂亮的图形和仪表板!

    Big Objects-定义自定义

    学习目标

    完成本单元后,您将能够:

    • 创建自定义Big Objects。
    • 构建自定义索引。
    • 部署自定义Big Objects。
    • 填充一个Big Objects。

    定义自定义Big Objects

    所以你已经查看了自定义Big Objects的用例,或者想出了自己的用例。现在是时候建立一个。

    您可以在安装程序中定义自定义Big Objects。您还可以使用Metadata API定义自定义Big Objects,但在安装程序中更简单。要开始使用,请登录您的Trailhead Playground并转到安装程序。在较高的层次上,这就是你如何定义一个Big Objects。

    1. 单击并选择“ 设置”
    2. Big Objects在“快速查找”框中输入,然后选择“ Big Objects
    3. 创建一个Big Objects并添加一些基本细节。
    4. 添加自定义字段。它们将数据存储在您的Big Objects上。
    5. 添加索引。索引定义Big Objects的复合主键,用于查询和过滤Big Objects数据。
    6. 保存Big Objects并将状态更改为已部署。

    现在让我们更详细地介绍这些步骤。

    虽然自定义Big Objects与标准对象和自定义对象类似,但某些参数对于Big Objects是唯一的,并且某些参数不适用。对象名称在组织中的所有标准,自定义,外部和大型对象中必须是唯一的。

    Big Objects定义细节

    定义Big Objects时,首先要填写一些有关它的基本细节。

    字段名称描述
    标签此名称用于引用用户界面中的对象。
    多个标签对象的复数名称。
    从元音开始如果它适合您组织的默认语言,请指明标签前面是“an”还是“a”。
    对象名称Big Objects的唯一API名称。在托管包中,此名称可防止与包安装发生命名冲突。仅使用字母数字字符和下划线。名称必须以字母开头且没有空格。它不能以下划线结尾,也不能有两个连续的下划线。保存后,Big Objects的API名称将使用后缀“__b”与自定义对象后缀“__c”进行标识。
    描述有意义的描述可帮助您记住在列表中查看对象时之间的差异。
    上下文相关的帮助设置定义用户从对象记录的主页(概述),编辑和详细信息页面,列表视图和相关列表中单击此页面的“帮助”时显示的URL 。此设置不会影响页面顶部的“帮助”链接。该链接始终打开“帮助”窗口。
    部署状态创建Big Objects时,状态将设置为In Development。在包含至少包含一个自定义字段的索引之前,您无法部署Big Objects。索引中只允许使用必需的自定义字段。创建索引后,您会看到Deployed的第二个状态。准备好授予用户访问权限后,将状态更改为“已部署”。

    Big Objects自定义字段

    定义好Big Objects后,添加自定义字段。自定义字段存储Big Objects的唯一数据。您还可以创建自定义关系字段,以将您的Big Objects与Salesforce中的另一个对象相关联。将自定义字段添加到Big Objects的方式与向Salesforce中的任何对象添加自定义字段的方式相同。Big Objects支持以下字段类型:

    • 查找关系
    • 日期时间
    • 文本
    • 文字区(长)

    要为Big Objects创建索引,必须至少将一个自定义字段标记为必需。

    定义自定义Big Objects的索引

    这个很重要!请记住,Big Objects索引中定义的字段决定了Big Objects的身份和查询能力。索引中定义的字段应该是与查询最相关的字段,因此您必须具有远见并在此处进行一些规划。您定义字段的顺序也是一个重要的考虑因素。如果您使用SOQL查询Big Objects,则只能按照您定义它们的顺序查询构成索引的字段。将查询过滤器中最常用的字段分配到第一个位置。你的索引。您还可以仅使用特定的比较运算符,具体取决于字段在查询中的位置。我们将在下一个单元中详细介绍查询。

    定义索引时请记住这些注意事项。

    • 索引必须至少包含一个自定义字段,并且最多可以包含五个自定义字段。
    • 索引中包含的自定义字段必须标记为必需。
    • 长文本区域字段不能包含在索引中。
    • 索引中所有文本字段的字符总数不能超过50。
    • 创建索引后,您无法编辑或删除它。要更改索引,请使用新索引创建另一个Big Objects。

    Big Objects索引详细信息

    定义组成自定义Big Objects索引的字段,并确定字段和排序顺序。

    字段名称描述
    标签标签用于指代用户界面中的索引。
    名称索引的API名称。
    索引字段为索引中包含的每个自定义字段设置“索引位置”和“索引方向”。此处的字段顺序决定了它们在索引中的顺序。对于最常用的过滤器参数,将“索引位置”设置为1。Index Direction的有效值为Ascending和Descending。

    示例自定义Big Objects

    现在您已经知道制作自定义Big Objects需要什么,请尝试制作一个。让我们假装你开发了这款超棒的新游戏,SFORCE-COM:UFBO防御,玩家可以防御地球对抗身份不明的飞行大物体威胁。您希望能够存储玩家在单个游戏会话中进行的所有互动。在每个游戏会话中,您可以在自定义Big Objects中捕获此信息,Customer_Interaction__b:

    • 玩家购买的东西数量 In_Game_Purchase__c
    • 他们取得的最高水平 Level_Achieved__c
    • 他们有多少人的生命 Lives_This_Game__c
    • 他们的平台在 Game_Platform__c
    • 他们的得分在 Score_This_Game__c
    • 他们的帐户名称 Account__c
    • 他们的比赛日期在 Play_Date__c
    • 他们的上场时间 Play_Duration__c

    您的游戏非常受欢迎,因此对于每个用户,您每天都会进行多次互动,再加上您庞大的玩家群,这是一个非常惊人的记录数。啊,成功的代价!

    您可以在自定义Big Objects上定义所有这些字段。定义字段后,还可以定义构成索引的字段。每个玩家的帐户名称都是唯一的,因此您已经选择了Account__c作为我们指数中的第一个字段。索引中的下一个字段是玩家的游戏平台,Game_Platform__c那么会议的日期, Play_Date__c。此特定订单允许您仅查询帐户,帐户和游戏平台,帐户,游戏平台和播放日期。

    使用这些示例中的确切值来创建具有八个自定义字段和索引的自定义Big Objects。如果表中未列出字段和值,请忽略它或将其保留为默认值。

    Big Objects定义细节

    字段名称
    标签客户互动
    多个标签客户互动
    对象名称Customer_Interaction
    描述留着空白
    部署状态开发中

    Big Objects自定义字段

    • 游戏内购买
      • 数据类型:文本
      • 现场标签:游戏内购买
      • 长度:16
      • 字段名称:In_Game_Purchase
      • 要求:不
    • 达到水平
      • 数据类型:文本
      • 字段标签:达到等级
      • 长度:16
      • 字段名称:Level_Achieved
      • 要求:不
    • 生活使用这个游戏
      • 数据类型:数字
      • Field Label:生活使用此游戏
      • 长度:18
      • 小数位:0
      • 字段名称:Lives_This_Game
      • 要求:不
    • 平台
      • 数据类型:文本
      • 字段标签:平台
      • 长度:16
      • 字段名称:Game_Platform
      • 要求:是的
    • 得分这个游戏
      • 数据类型:文本
      • Field Label:为这场比赛打分
      • 长度:16
      • 字段名称:Score_This_Game
      • 要求:不
    • 帐户
      • 数据类型:查找
      • 相关:帐户
      • 字段标签:帐户
      • 字段名称:Game_User_Account
      • 要求:是的
    • 比赛日期
      • 数据类型:日期/时间
      • 字段标签:播放日期
      • 字段名称:Play_Date
      • 要求:是的
    • 播放持续时间
      • 数据类型:数字
      • 字段标签:播放持续时间
      • 长度:18
      • 小数位:2
      • 字段名称:Play_Duration
      • 要求:不

    现在,您有八个字段可以跟踪所有玩家的互动情况。做得好!

    大对象自定义字段

    Big Objects索引详细信息

    字段名称
    标签客户互动指数
    名称CustomerInteractionsIndex
    索引字段指数位置1:账户_c,降序索引位置2:Game_Platform__c,升序索引位置3:Play_Date__c,降序

    部署Big Objects

    现在您已经定义了自定义Big Objects,您已准备好部署它。单击 Big Objects上的“ 编辑 ”,然后将部署状态更改为“已部署”。

    它们出现在设置中的大对象。

    现在,您已准备好开始使用新的自定义Big Objects。

    设置中的自定义大对象。

    从这里,您可以编辑自定义Big Objects及其字段的标签和名称,但不能编辑或删除索引。要更改索引,请从新的Big Objects开始。您还可以从安装程序中删除自定义Big Objects。删除的Big Objects存储15天。在此期间,您可以恢复或永久删除它,但在这15天后,Big Objects将被永久删除。

    填充Big Objects

    填充Big Objects有两种主要方式。您可以将.csv文件与Data Loader或API一起使用,或者通过Apex完全执行。使用.csv文件时,文件中的第一行必须包含用于将.csv数据映射到自定义Big Objects的字段标签。将数据上传到Data Loader中的Big Objects或通过Bulk API或SOAP API上传。这是我们用来上传到我们的.csv文件Customer_Interaction__bBig Objects。作为一个例子,一个Big Objects可以支持比我们在这里提供的数据多很多倍的数据。

    Play Start,In-Game Purchase,Level Achieved,Lives Used,Platform,Play Stop,Score,Account
    2015-01-01T23:01:01Z,A12569,57,7,PC,2015-01-02T02:27:01Z,55736,001R000000302D3
    2015-01-03T13:22:01Z,B78945,58,7,PC,2015-01-03T15:47:01Z,61209,001R000000302D3
    2015-01-04T15:16:01Z,D12156,43,5,iOS,2015-01-04T16:55:01Z,36148,001R000000302D3

    如果你想使用Apex填充 Customer_Interaction__b, 使用 insertImmediate 方法。

    // Define the record
    Customer_Interaction__b bo = new Customer_Interaction__b();
    bo.Account__c = '001R000000302D3';
    bo.Game_Platform__c = 'PC';
    bo.Play_Date__c = DateTime.newInstance(2018, 2, 5);
    bo.In_Game_Purchase__c = 'A12569';
    bo.Level_Achieved__c = '45';
    bo.Lives_This_Game__c = '3';
    bo.Score_This_Game__c = '5500';
    bo.Play_Duration__c = 25;
     
    // Insert the record, which creates a new record
    database.insertImmediate(bo);
    // Define the record
    Customer_Interaction__b bo = new Customer_Interaction__b();
    bo.Account__c = '001R000000302D3';
    bo.Game_Platform__c = 'PC';
    bo.Play_Date__c = DateTime.newInstance(2018, 2, 5);
    bo.In_Game_Purchase__c = 'A12569';
    bo.Level_Achieved__c = '45';
    bo.Lives_This_Game__c = '3';
    bo.Score_This_Game__c = '5500';
    bo.Play_Duration__c = 25;
     
    // Modify a field in the index
    bo.Game_Platform__c = 'Mac';
     
    // Insert the record, creating a new record because the primary key has changed 
    database.insertImmediate(bo);
    
    // Define the record
    Customer_Interaction__b bo = new Customer_Interaction__b();
    bo.Account__c = '001R000000302D3';
    bo.Game_Platform__c = 'PC';
    bo.Play_Date__c = DateTime.newInstance(2018, 2, 5);
    bo.In_Game_Purchase__c = 'A12569';
    bo.Level_Achieved__c = '45';
    bo.Lives_This_Game__c = '3';
    bo.Score_This_Game__c = '5500';
    bo.Play_Duration__c = 25;
     
    // Modify a field not included in the index
    bo.Level_Achieved__c = '1';
     
    // Insert the record, which updates the second record because the index is the same 
    database.insertImmediate(bo);
    警告

    警告

    不允许使用混合DML调用的Apex测试失败。如果只写入Big Objects,则测试会将错误数据插入到您必须手动删除的目标Big Objects中。要包含对目标Big Objects的测试DML调用,请使用带有Apex存根API的模拟框架。

    重新插入具有相同索引但具有不同数据的记录会导致类似于upsert操作的行为。如果存在具有索引的记录,则插入将使用新数据覆盖索引值。插入是幂等的,因此插入现有数据不会导致重复。上传数百万条记录时,重新插入很有帮助。如果发生错误,则重新插入会重新上载失败的上载而不会出现重复数据。在重新插入期间,如果提供的索引不存在记录,则插入新记录。