Elasticsearch 问题解决方法论——你的问题是什么?

共 5767字,需浏览 12分钟

 ·

2022-01-10 13:54


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

推荐

1、重磅 | 死磕 Elasticsearch 方法论认知清单(2021年国庆更新版)
2Elasticsearch 7.X 进阶实战私训课(口碑不错)
3、实战 | Elasticsearch自定义评分的N种方法

短时间快习得多干货!

已带领88球友通过 Elastic 官方专家认证!


比同事抢先一步学习进阶干货
浏览 16
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报