Elasticsearch 问题解决方法论——你的问题是什么?
1、问题来源
今天收到一位球友的问题,好家伙:PDF 文档,问题内容长度 25 页。
这是我职业生涯见过的最长的问题了。
我的第一反应:太长了。
打开后仔细看了一遍,的确内容很全,包含但不限于:
Mapping
template
检索召回数据全部结果
检索&聚合语句
但是,问题究竟要问什么反而没有说的非常清楚。
经过沟通,了解到问题的本质:“Nested 字段召回数据结果中将包含特定字符‘/’的字符串排在前面”。
关联核心知识点:Elasticsearch 自定义评分的知识点。
个人认为,把问题尽可能的简化为三段论更有助于解决问题。参考如下:
第一部分:交代背景+问题来龙去脉。
第二部分:交代清楚问题,尽量用最简洁、通俗易懂的语言直击问题要害,说清楚、讲明白。
第三部分:自己已经做了哪些尝试,均没有解决,猜测可能原因等补充内容。
再次强调:问题描述清楚是解决问题的关键。
2、实战一把
2.1 数据建模
PUT test-004
{
"mappings": {
"properties": {
"tags": {
"type": "nested",
"dynamic": "false",
"properties": {
"key": {
"type": "keyword",
"ignore_above": 256
},
"tagType": {
"type": "keyword",
"ignore_above": 256
},
"value": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
2.2 数据导入
POST test-004/_bulk
{"index":{"_id":1}}
{"tags":[{"key":"thread.id","type":"int64","value":"164"},{"key":"trace_id","type":"string","value":"db06e6c72e597dfd42ba951a4b215e2c"},{"key":"http.target","type":"string","value":"/ucenter/languages"}]}
{"index":{"_id":2}}
{"tags":[{"key":"net.peer.port","type":"int64","value":"60194"},{"key":"http.method","type":"string","value":"GET"},{"key":"status_code","type":"int64","value":"200"},{"key":"cost_millis","type":"int64","value":"944"}]}
{"index":{"_id":3}}
{"tags":[{"key":"net.peer.port","type":"int64","value":"/ucenter/language"},{"key":"http.method","type":"string","value":"GET"},{"key":"status_code","type":"int64","value":"200"},{"key":"cost_millis","type":"int64","value":"944"}]}
2.3 实现方式一:加了匹配字段
POST test-004/_search
{
"query": {
"nested": {
"path": "tags",
"query": {
"bool": {
"should": [
{
"exists": {
"field": "tags.value"
}
},
{
"wildcard": {
"tags.value": "*/*"
}
}
]
}
}
}
}
}
2.4 实现方式二:借助 function_score 实现
POST test-004/_search
{
"query": {
"function_score": {
"functions": [
{
"filter": {
"nested": {
"path": "tags",
"query": {
"bool": {
"should": [
{
"wildcard": {
"tags.value": "*/*"
}
}
]
}
}
}
},
"weight": 23
}
],
"max_boost": 42,
"score_mode": "max",
"boost_mode": "multiply",
"min_score": 1
}
}
}
2.5 实现方式三:rescore 再评分实现
POST test-004/_search
{
"query": {
"match_all": {}
},
"rescore": {
"window_size": 100,
"query": {
"rescore_query": {
"function_score": {
"functions": [
{
"filter": {
"nested": {
"path": "tags",
"query": {
"wildcard": {
"tags.value": "*/*"
}
}
}
},
"weight": 300
}
],
"score_mode": "sum",
"boost_mode": "sum"
}
},
"score_mode": "max",
"query_weight": 1,
"rescore_query_weight": 1
}
}
}
3、方案探讨
上述方案的实现,本质都没有改变已有的 Mapping及分词器。
所以针对 keyword 类型使用了之前不推荐的:wildcard 检索方式。
但,这不见得就是最优方案。
最优方案需要在:数据写入前预处理或者结合自定义分词实现。
4、关于提问,9年前的一篇旧文
关于“你的问题是什么”——如下是 2013 年我作为新入职工程师采访资深老同事的短文。
PS:已过去9年,文中的叶哥早已晋升为资深架构师。
你的问题是什么?——架构师叶哥的访谈感悟
初识叶哥是因为做代理需要lotus的lz1压缩算法,这块以前是他做的,现在部分内容交接给我来做。当时对算法的理解不是很到位,整理了思路去问他,我印象很深刻,我当时将问题的来龙去脉加自己的理解说了一通。他突然打断我:“你的问题是什么?”这时候,我忽然意识到,对啊,问题的本质还没有抛出来,作为程序员,简洁、明了的说明问题是一种能力,更是高效解决问题的方法。
这点对我的感触很大,我做过反思,但还有待进一步提高,今晚的访谈又被问到了,“你的问题是什么?”,这时候,我意识到要跑偏了,悬崖勒马很快的抛出问题,才算走向正轨。
选择叶哥做访谈除了上面的原因,还有他是我导师的导师,这样延续性较好,又是资深工程师,技术方面有很多值得学习的地方。当然了,我们部门这个季度光荣榜更是浓墨重彩一笔,新增了1个资深、2个高工、YY哥的3万行代码的11个bug的低bug率更是另我们新员工艳羡不止,他们都有着不同的闪光点。
聊了1个小时的时间,叶哥真诚、质朴的回答了我们的所有问题,很有感触。特总结以下几个核心点:
一、时间、效率、目标达成、结果导向
就自己而言,将近期试用期间遇到的问题向叶哥提问:“导师安排的任务和自己达成情况的问题,刚开始还好,随着项目的深入,可能有时候尽管很努力,但还是完成的不够好。”叶哥谈到,这块可以和导师协商,但是答应下来的一定要做到。可以通过自己抽业余时间加班的方式来实现。是的,这点和公司的结果导向是一致的。但时间、效率方面的衡量,要分清事情的轻重缓急,有目标、分阶段高效实现很重要。
二、技术的积累和深度
其实效率的达成和知识的积累和技术的深度是分不开的,我提及看过他与YY 的代码,感觉很工整、思路很清晰。他谦虚的说道,也是好多人都改过的。并告诫我们,还是要夯实基础,比如我们以前搞 Windows 的,对Linux不熟悉,就要平时花时间去学习、去积累。他提及,当时他刚来的时候,也是遇到问题,他的导师很快的几个命令就把问题解决了,这时候当然可能凭记忆一下记忆不住,但一定要拿本记录下来,并下去通过“Google、baidu”了解其具体的应用,这样才能举一反三。道理很简单,但很值得我去反思,叶哥提到“Google就是最好的老师”。
三、多读书
是的,搞技术的没有不读技术书籍的。我诡异的问道“像你这个级别了,都资深了,个人储备都很足够了,要不要看技术书籍”。当然了,我们知道答案肯定是要看了,但想听听叶哥的深刻见解。他笑笑说,技术的书肯定要看的,有部分知识可能遇到的时候再去学习会理解的更深刻。并指出早期其读《代码大全》对现在编码都有影响。他说道“一本书,一天看一点,迟早会看完的”,的确,值得我去好好学习下的。他还提到,当时他的导师就曾花十一假期的时间,专门闭关“研读代码linux内核代码”。顿时感觉差距不是一点半点。
四、分析问题、解决问题的能力
我想到了叶哥肯定做过面试官,就好奇的问道,“作为一个面试官,你最看重什么?”,他提及自己做过一面,主要问具体的技术,当然很重要的一点会问应聘者“有没有遇到过技术难题,是怎么解决的?”。这点的确很关键,做技术的都会遇到技术难题,尤其我们进入公司团队开发后,遇到问题、思考问题关键点、分析问题、解决问题的能力很重要。其间,他提到当时AF团队花了很长时间解决“踩内存bug”后的大家的心情,能体会到那种“如释重负”的快感和“团队协作奋战”的喜悦;也深刻感觉细节处理的重要性。
五、创新
公司是鼓励创新的,公司甚至都有创新论坛模块,可见公司的重视程度。我们就公司的创新、去年的“技术创新大奖”做了咨询。他提及,这些创新不一定是多大的创新,有的可能就是一个微创新,一个简单的想法如果能给公司带来开发效率的提升,公司都是鼓励的。
六、对新员工要说的
这点我是感觉是整个访谈的核心,叶哥工作近5年的时间,我们很想听的就是肺腑之言。“一路走来,有没有想对新员工说的?”,叶哥提及,工作态度很重要,新员工态度要端正,干劲要足。公司的相关政策,比如职称评定、买房无息贷款、未来的公司上市计划等都会给员工带来收益的。
当然,访谈还有很多细节不能一一列举,总之,很顺利、很有收获,叶哥也对我们说了很多鼓励的话。总结一句话就是“态度积极、提供效率,对自己的发展、对为公司的发展贡献自己的力量都很有帮助!”。
两个月来,不止这次访谈中,平时的工作中也发现了自己的很多不足,正如我们访谈中笑谈到“看到公司的员工一个个像打了‘鸡血’似的,倍感压力巨大”。是的,有压力才有动力!希望自己在接下来的时间里,能认识到不足,及时跟进与改进,好好反思!至少能分清事情的轻重缓急,试图改进提高效率;至少能端正好工作态度,每天以饱满的激情投入到工作中去;至少再问问题能抓住重点,不会再被问道“你的问题是什么?”
加油ing!
后半部分旧文成文时间:2013-08-24 13:08
推荐
更短时间更快习得更多干货!
已带领88位球友通过 Elastic 官方专家认证!