Elasticsearch 問(wèn)題解決方法論——你的問(wèn)題是什么?
1、問(wèn)題來(lái)源
今天收到一位球友的問(wèn)題,好家伙:PDF 文檔,問(wèn)題內(nèi)容長(zhǎng)度 25 頁(yè)。

這是我職業(yè)生涯見(jiàn)過(guò)的最長(zhǎng)的問(wèn)題了。
我的第一反應(yīng):太長(zhǎng)了。
打開(kāi)后仔細(xì)看了一遍,的確內(nèi)容很全,包含但不限于:
Mapping
template
檢索召回?cái)?shù)據(jù)全部結(jié)果
檢索&聚合語(yǔ)句
但是,問(wèn)題究竟要問(wèn)什么反而沒(méi)有說(shuō)的非常清楚。
經(jīng)過(guò)溝通,了解到問(wèn)題的本質(zhì):“Nested 字段召回?cái)?shù)據(jù)結(jié)果中將包含特定字符‘/’的字符串排在前面”。
關(guān)聯(lián)核心知識(shí)點(diǎn):Elasticsearch 自定義評(píng)分的知識(shí)點(diǎn)。
個(gè)人認(rèn)為,把問(wèn)題盡可能的簡(jiǎn)化為三段論更有助于解決問(wèn)題。參考如下:
第一部分:交代背景+問(wèn)題來(lái)龍去脈。
第二部分:交代清楚問(wèn)題,盡量用最簡(jiǎn)潔、通俗易懂的語(yǔ)言直擊問(wèn)題要害,說(shuō)清楚、講明白。
第三部分:自己已經(jīng)做了哪些嘗試,均沒(méi)有解決,猜測(cè)可能原因等補(bǔ)充內(nèi)容。
再次強(qiáng)調(diào):?jiǎn)栴}描述清楚是解決問(wèn)題的關(guān)鍵。
2、實(shí)戰(zhàn)一把
2.1 數(shù)據(jù)建模
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 數(shù)據(jù)導(dǎo)入
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 實(shí)現(xiàn)方式一:加了匹配字段
POST?test-004/_search
{
??"query":?{
????"nested":?{
??????"path":?"tags",
??????"query":?{
????????"bool":?{
??????????"should":?[
????????????{
??????????????"exists":?{
????????????????"field":?"tags.value"
??????????????}
????????????},
????????????{
??????????????"wildcard":?{
????????????????"tags.value":?"*/*"
??????????????}
????????????}
??????????]
????????}
??????}
????}
??}
}
2.4 實(shí)現(xiàn)方式二:借助 function_score 實(shí)現(xiàn)
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 實(shí)現(xiàn)方式三:rescore 再評(píng)分實(shí)現(xiàn)
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、方案探討
上述方案的實(shí)現(xiàn),本質(zhì)都沒(méi)有改變已有的 Mapping及分詞器。
所以針對(duì) keyword 類型使用了之前不推薦的:wildcard 檢索方式。
但,這不見(jiàn)得就是最優(yōu)方案。
最優(yōu)方案需要在:數(shù)據(jù)寫入前預(yù)處理或者結(jié)合自定義分詞實(shí)現(xiàn)。
4、關(guān)于提問(wèn),9年前的一篇舊文
關(guān)于“你的問(wèn)題是什么”——如下是 2013 年我作為新入職工程師采訪資深老同事的短文。
PS:已過(guò)去9年,文中的葉哥早已晉升為資深架構(gòu)師。
你的問(wèn)題是什么?——架構(gòu)師葉哥的訪談感悟
初識(shí)葉哥是因?yàn)樽龃硇枰猯otus的lz1壓縮算法,這塊以前是他做的,現(xiàn)在部分內(nèi)容交接給我來(lái)做。當(dāng)時(shí)對(duì)算法的理解不是很到位,整理了思路去問(wèn)他,我印象很深刻,我當(dāng)時(shí)將問(wèn)題的來(lái)龍去脈加自己的理解說(shuō)了一通。他突然打斷我:“你的問(wèn)題是什么?”這時(shí)候,我忽然意識(shí)到,對(duì)啊,問(wèn)題的本質(zhì)還沒(méi)有拋出來(lái),作為程序員,簡(jiǎn)潔、明了的說(shuō)明問(wèn)題是一種能力,更是高效解決問(wèn)題的方法。
這點(diǎn)對(duì)我的感觸很大,我做過(guò)反思,但還有待進(jìn)一步提高,今晚的訪談?dòng)直粏?wèn)到了,“你的問(wèn)題是什么?”,這時(shí)候,我意識(shí)到要跑偏了,懸崖勒馬很快的拋出問(wèn)題,才算走向正軌。
選擇葉哥做訪談除了上面的原因,還有他是我導(dǎo)師的導(dǎo)師,這樣延續(xù)性較好,又是資深工程師,技術(shù)方面有很多值得學(xué)習(xí)的地方。當(dāng)然了,我們部門這個(gè)季度光榮榜更是濃墨重彩一筆,新增了1個(gè)資深、2個(gè)高工、YY哥的3萬(wàn)行代碼的11個(gè)bug的低bug率更是另我們新員工艷羨不止,他們都有著不同的閃光點(diǎn)。
聊了1個(gè)小時(shí)的時(shí)間,葉哥真誠(chéng)、質(zhì)樸的回答了我們的所有問(wèn)題,很有感觸。特總結(jié)以下幾個(gè)核心點(diǎn):
一、時(shí)間、效率、目標(biāo)達(dá)成、結(jié)果導(dǎo)向
就自己而言,將近期試用期間遇到的問(wèn)題向葉哥提問(wèn):“導(dǎo)師安排的任務(wù)和自己達(dá)成情況的問(wèn)題,剛開(kāi)始還好,隨著項(xiàng)目的深入,可能有時(shí)候盡管很努力,但還是完成的不夠好。”葉哥談到,這塊可以和導(dǎo)師協(xié)商,但是答應(yīng)下來(lái)的一定要做到??梢酝ㄟ^(guò)自己抽業(yè)余時(shí)間加班的方式來(lái)實(shí)現(xiàn)。是的,這點(diǎn)和公司的結(jié)果導(dǎo)向是一致的。但時(shí)間、效率方面的衡量,要分清事情的輕重緩急,有目標(biāo)、分階段高效實(shí)現(xiàn)很重要。
二、技術(shù)的積累和深度
其實(shí)效率的達(dá)成和知識(shí)的積累和技術(shù)的深度是分不開(kāi)的,我提及看過(guò)他與YY 的代碼,感覺(jué)很工整、思路很清晰。他謙虛的說(shuō)道,也是好多人都改過(guò)的。并告誡我們,還是要夯實(shí)基礎(chǔ),比如我們以前搞 Windows 的,對(duì)Linux不熟悉,就要平時(shí)花時(shí)間去學(xué)習(xí)、去積累。他提及,當(dāng)時(shí)他剛來(lái)的時(shí)候,也是遇到問(wèn)題,他的導(dǎo)師很快的幾個(gè)命令就把問(wèn)題解決了,這時(shí)候當(dāng)然可能憑記憶一下記憶不住,但一定要拿本記錄下來(lái),并下去通過(guò)“Google、baidu”了解其具體的應(yīng)用,這樣才能舉一反三。道理很簡(jiǎn)單,但很值得我去反思,葉哥提到“Google就是最好的老師”。
三、多讀書(shū)
是的,搞技術(shù)的沒(méi)有不讀技術(shù)書(shū)籍的。我詭異的問(wèn)道“像你這個(gè)級(jí)別了,都資深了,個(gè)人儲(chǔ)備都很足夠了,要不要看技術(shù)書(shū)籍”。當(dāng)然了,我們知道答案肯定是要看了,但想聽(tīng)聽(tīng)葉哥的深刻見(jiàn)解。他笑笑說(shuō),技術(shù)的書(shū)肯定要看的,有部分知識(shí)可能遇到的時(shí)候再去學(xué)習(xí)會(huì)理解的更深刻。并指出早期其讀《代碼大全》對(duì)現(xiàn)在編碼都有影響。他說(shuō)道“一本書(shū),一天看一點(diǎn),遲早會(huì)看完的”,的確,值得我去好好學(xué)習(xí)下的。他還提到,當(dāng)時(shí)他的導(dǎo)師就曾花十一假期的時(shí)間,專門閉關(guān)“研讀代碼linux內(nèi)核代碼”。頓時(shí)感覺(jué)差距不是一點(diǎn)半點(diǎn)。
四、分析問(wèn)題、解決問(wèn)題的能力
我想到了葉哥肯定做過(guò)面試官,就好奇的問(wèn)道,“作為一個(gè)面試官,你最看重什么?”,他提及自己做過(guò)一面,主要問(wèn)具體的技術(shù),當(dāng)然很重要的一點(diǎn)會(huì)問(wèn)應(yīng)聘者“有沒(méi)有遇到過(guò)技術(shù)難題,是怎么解決的?”。這點(diǎn)的確很關(guān)鍵,做技術(shù)的都會(huì)遇到技術(shù)難題,尤其我們進(jìn)入公司團(tuán)隊(duì)開(kāi)發(fā)后,遇到問(wèn)題、思考問(wèn)題關(guān)鍵點(diǎn)、分析問(wèn)題、解決問(wèn)題的能力很重要。其間,他提到當(dāng)時(shí)AF團(tuán)隊(duì)花了很長(zhǎng)時(shí)間解決“踩內(nèi)存bug”后的大家的心情,能體會(huì)到那種“如釋重負(fù)”的快感和“團(tuán)隊(duì)協(xié)作奮戰(zhàn)”的喜悅;也深刻感覺(jué)細(xì)節(jié)處理的重要性。
五、創(chuàng)新
公司是鼓勵(lì)創(chuàng)新的,公司甚至都有創(chuàng)新論壇模塊,可見(jiàn)公司的重視程度。我們就公司的創(chuàng)新、去年的“技術(shù)創(chuàng)新大獎(jiǎng)”做了咨詢。他提及,這些創(chuàng)新不一定是多大的創(chuàng)新,有的可能就是一個(gè)微創(chuàng)新,一個(gè)簡(jiǎn)單的想法如果能給公司帶來(lái)開(kāi)發(fā)效率的提升,公司都是鼓勵(lì)的。
六、對(duì)新員工要說(shuō)的
這點(diǎn)我是感覺(jué)是整個(gè)訪談的核心,葉哥工作近5年的時(shí)間,我們很想聽(tīng)的就是肺腑之言?!耙宦纷邅?lái),有沒(méi)有想對(duì)新員工說(shuō)的?”,葉哥提及,工作態(tài)度很重要,新員工態(tài)度要端正,干勁要足。公司的相關(guān)政策,比如職稱評(píng)定、買房無(wú)息貸款、未來(lái)的公司上市計(jì)劃等都會(huì)給員工帶來(lái)收益的。
當(dāng)然,訪談還有很多細(xì)節(jié)不能一一列舉,總之,很順利、很有收獲,葉哥也對(duì)我們說(shuō)了很多鼓勵(lì)的話。總結(jié)一句話就是“態(tài)度積極、提供效率,對(duì)自己的發(fā)展、對(duì)為公司的發(fā)展貢獻(xiàn)自己的力量都很有幫助!”。
兩個(gè)月來(lái),不止這次訪談中,平時(shí)的工作中也發(fā)現(xiàn)了自己的很多不足,正如我們?cè)L談中笑談到“看到公司的員工一個(gè)個(gè)像打了‘雞血’似的,倍感壓力巨大”。是的,有壓力才有動(dòng)力!希望自己在接下來(lái)的時(shí)間里,能認(rèn)識(shí)到不足,及時(shí)跟進(jìn)與改進(jìn),好好反思!至少能分清事情的輕重緩急,試圖改進(jìn)提高效率;至少能端正好工作態(tài)度,每天以飽滿的激情投入到工作中去;至少再問(wèn)問(wèn)題能抓住重點(diǎn),不會(huì)再被問(wèn)道“你的問(wèn)題是什么?”
加油ing!
后半部分舊文成文時(shí)間:2013-08-24 13:08
推薦
更短時(shí)間更快習(xí)得更多干貨!
已帶領(lǐng)88位球友通過(guò) Elastic 官方專家認(rèn)證!

