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
462 0
|
Java
使用elasticsearch遇到的一些问题以及解决方法(不断更新)
7.org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream 原因:es节点之间的JDK版本不一样 解决方法:统一JDK环境   8 .
2259 0
|
1天前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
8 5
|
29天前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
97 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
3月前
|
数据可视化 Docker 容器
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
这篇文章提供了通过Docker安装Elasticsearch和Kibana的详细过程和图解,包括下载镜像、创建和启动容器、处理可能遇到的启动失败情况(如权限不足和配置文件错误)、测试Elasticsearch和Kibana的连接,以及解决空间不足的问题。文章还特别指出了配置文件中空格的重要性以及环境变量中字母大小写的问题。
一文教会你如何通过Docker安装elasticsearch和kibana 【详细过程+图解】
|
3月前
|
JSON 自然语言处理 数据库
Elasticsearch从入门到项目部署 安装 分词器 索引库操作
这篇文章详细介绍了Elasticsearch的基本概念、倒排索引原理、安装部署、IK分词器的使用,以及如何在Elasticsearch中进行索引库的CRUD操作,旨在帮助读者从入门到项目部署全面掌握Elasticsearch的使用。
|
3月前
|
Ubuntu Oracle Java
如何在 Ubuntu VPS 上安装 Elasticsearch
如何在 Ubuntu VPS 上安装 Elasticsearch
37 0
|
3月前
|
存储 Ubuntu Oracle
在Ubuntu 14.04上安装和配置Elasticsearch的方法
在Ubuntu 14.04上安装和配置Elasticsearch的方法
42 0

热门文章

最新文章

下一篇
无影云桌面