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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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及分词器。

但,这不见得就是最优方案。

最优方案需要在:数据写入前预处理或者结合自定义分词实现。

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 官方专家认证!

比同事抢先一步学习进阶干货!


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
安全 Java Linux
在linux虚拟机安装Elasticsearch遇到的问题及解决方法
在linux虚拟机安装Elasticsearch遇到的问题及解决方法 [0] unable to load JNA native support library, native methods will be disabled [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at leas
362 0
|
Java
使用elasticsearch遇到的一些问题以及解决方法(不断更新)
7.org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream 原因:es节点之间的JDK版本不一样 解决方法:统一JDK环境   8 .
2194 0
|
20天前
|
Java Maven 开发工具
【ElasticSearch 】IK 分词器安装
【ElasticSearch 】IK 分词器安装
33 1
|
20天前
|
数据可视化 索引
elasticsearch head、kibana 安装和使用
elasticsearch head、kibana 安装和使用
|
20天前
|
存储 负载均衡 索引
linux7安装elasticsearch-7.4.0集群配置
linux7安装elasticsearch-7.4.0集群配置
120 0
|
20天前
|
Java Windows
windows下 安装 Elasticsearch报错warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
windows下 安装 Elasticsearch报错warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
75 0
|
20天前
|
搜索推荐 Java 大数据
ElasticSearch安装
ElasticSearch安装
|
20天前
|
JSON Unix Linux
Elasticsearch如何安装
Elasticsearch如何安装
|
20天前
|
存储 数据可视化 数据挖掘
【ElasticSearch】ElasticSearch安装
【ElasticSearch】ElasticSearch安装
31 2