铭毅天下

1、引子

我是 2020 年 4 月 30 日通过的认证,应群主之邀,写一篇经验分享,也是给我的认证之路做一个小结。其实和很多群友想的不一样,我平常在工作中要写 DSL 的机会不多,和 ES 相关的,更多的是评估容量和成本,决定一个场景到底要不要用,要设计哪些功能。虽然平时零零碎碎地看了很多 ES 相关的知识,但总觉得不成体系,考虑问题的时候会发现有些内容自己是不知道的。因此想考一个 Elastic 认证,借这个机会全面地学习和了解 ES 的整个体系。

我其实去年 10 月份就报名了。那会儿我是冲着当时可以补考一次的优惠去报的,后来发现补考一次的机会必须要发生在 10 月底之前,而我当时觉得自己并没有准备好,因此放弃了那次机会。后来直到年底前,工作都比较忙,我差点以为自己要放弃了。后来就到了春节期间,恰逢其时,新冠疫情爆发,在节后很长一段时间,我都是在家远程办公,在这个过程中,发现自己多了很多可以支配的时间。我就想,干嘛不乘这个机会把认证好好准备一下呢。

2、考前准备

其实我真正开始准备考试是 3 月 11 日,群主在共享资料中有一个 Excel 表格里面有认证考试的考点。我按照这个知识点列表自己制作了一个 number 的表格,每天给自己记录学习的状况。按照这个记录,我第一轮所有知识点是 4 月 1 日这天全部过完的。一共花了 21 天。

这个过程,我都基本上采取的是梳理–> 理解–> 总结的方式来进行的,这个过程中我一共写了 21 篇博文(包括后面一阶段),加起来可能有两万多字。大家有兴趣的话,可以来踩一踩,地址在这边, https://www.jianshu.com/u/0665e735f216

整个过程一开始是在家办公,时间比较宽裕,写了一些比较长的文章。到了后面复工了,我就晚上回家以后学习,然后写文章,差不多每天都会到 12 点多吧。这带来的一个后果是,每天晚上写完文章都很兴奋,导致有的时候会失眠。当然,这二十一天并不是每天都是这样,有的时候白天要开会,要解决困难问题又或者有团建,那天晚上基本上是搞不成的。

这 21 天给我最大的收获是给我形成了学习-思考-写作的正反馈,能够感受到自己每天在进步是促使我继续下去的最大动力。前几天看到群主在看一本书,是李笑来老师的《把时间当做朋友》,这本书我也看过,里面的内容非常不错。书中提到一点,写作是人对自己最有效也最持久的投资,这个过程中,你需要 思考,总结,提炼 并且把你的思考结果和他人进行交流。

4 月 1 日结束之后,由于是清明节,同时工作上面出现了一些问题需要解决,我中途停了一段时间。大概在 4 月 13 号的时候又重新开始,这一回我加入了考证打卡群。这个阶段主要是查漏补缺做真题,这个过程的意义在于提供了很多材料让我可以来使用之前学到的知识,毕竟有很多知识点,日常工作中如果使用不到,是很难想到一些应用场景的。在这个过程中,我也在群里认识了很多朋友,大家一起讨论问题非常愉快。群主 GitHub 上面的真题,包括博士的 40 道真题,之前已经考过的一些兄弟提供的题目,我全部都做了一遍,帮助非常大,考过之后发现其实大部分题目都见过。后来有一天,群主和我说,你差不多了。我想了想确实是这样,于是找到之前报名的账号到考试网站去约了时间。

3、考试的经过

我是提前三天约的考试,因为我想在考前再过一遍真题和考点。事实证明这个举措很有效果,后来在考试过程中遇到的“function_score”的题目就是在这个过程中弄明白的。考试的当天我请了一天假在家看知识点和真题,考试时间选的是晚上 19 点到 22 点,因为我准备用公司的科学上 wang,而放假之前一天的晚上基本上是没什么人加班的。我自己另外买了一条 科学上 wang,不过网速自然是比不上公司的专线了。

设备方面,我使用的是 12 寸的 MacBook 配上了外置的显示器和键盘,也是我运气比较好,监考官允许我使用这些外接设备,不然的话,在 MacBook 的 12 寸屏幕上考试,我估计会把眼睛看花吧。考官对我的环境检查得非常仔细,我房间的各个角落来来回回看了 2 遍,花了不少时间。后来又让我把程序坞里面所有的图标去掉,把除了浏览器之外所有的程序关掉。来来回回折腾了半个小时。我是 18:45 开始的,到了差不多 19:15 才启动考试程序进入考试环境。

整个检查过程弄得我非常紧张,导致我刚开始做题的时候脑子一片空白,打字的手都有点在抖。我有一个不太好的习惯,想事情的时候喜欢用手托着下巴,有的时候会把嘴捂上,这个时候监考官就会跳出来告诉我这是不允许的。这样的事情发生了三次,基本上我手一碰到嘴,他就会跳出来,感觉监考官全程都是看着我的。考试时候桌面的那个官方文档是一个大索引,之前查文档我从来没有这么玩过,找到正确的文档也花了好一会儿,这个是我比较失误的一个地方,如果能提前熟悉,至少能节省一些时间。考试的集群有 4 个,考试界面有整整一页都是描述这个集群,要仔细看一看。

一开始比较慌,前面几题花了我不少时间,到了后面适应了以后做题速度就加快了。20 点的时候我只完成了 2 道题,到了 21 点我做了 6 道题,大概是在 21:50 左右我完成了全部题目。这之后我回过头来看之前有问题的题目。一题是一道跨集群搜索的问题,这道题位置比较靠前,之前由于太紧张,怎么调整搜索 DSL 也得不到正确的结果,在检查得过程中发现是集群的名字写错了。

下面就是这道上面提到的 function_score 的真题。

索引 movie-1,保存的电影信息,title 是题目,tags 是电影的标签。

要求:

  1. 在 title 中包含“my”或者“me”。

  2. 如果在 tags 中包含"romatic movies",该条算分提高,如果不包含则算分不变。

其实我一开始是用的 bool search 做的,做完了感觉不对。因为如果用 bool 的话,无论怎样调整,都有可能搜索出一个 title 中不包含“my”或者“me”但是 tags 中包含“romatic movies”,又或者出现一条结果中出现 my 或者 me,但是因为 tags 中不包含“romatic movies”而导致这个文档没有被包含在搜索结果中。而题目的意思是 tags 这个条件应该是一个加分项而已。后来在检查得时候,我想到了用 function_score 来做。可能是紧张的缘故,我敲出来的 DSL 在 Kibana 中一直没办法正确解析,自己去检查那个语句怎么也看不出任何问题。我当时的心态有点像下面这张图:

后来,我想,官方文档上面的例子总是对的吧,于是把官方文档上的语句拷贝到 kibana 中,再把我之前写的查询,贴过去,结果果然成功了。

这个时候时间还有 6 分钟,我觉得自己已经没有什么可以做的了,而且确信所有题目应该都是正确的,于是提交了答案。监考官和我反复确认是否要结束考试,这个时间考试环境自动断开了,我看了时间是 22:14:37。应该正好是 3 个小�