elasticsearch搜索語法梳理 · 貳

前言
我今天本來相好的名字是“Elasticsearch正式深入學習”,因為按照官方文檔的章節(jié)安排,入門部分的內(nèi)容已經(jīng)結(jié)束了,所以今天應該算是開始更系統(tǒng)的學習,而且今天分享的內(nèi)容也并非與搜索相關,但是為了和昨天的內(nèi)容保持隊形,我就延續(xù)了昨天的名稱。
昨天我其實已經(jīng)算是對elasticsearch做了一個我自己的定性——一套獨立的知識體系,所以從今天開始,我覺得有必要對elasticsearch的學習策略做一定的調(diào)整:未來會不定期分享es的相關內(nèi)容,而且盡可能會以分享小知識點的方式來展開,所以暫時不會把es作為核心創(chuàng)作對象來更新。具體原因我放在文末了,感興趣的小伙伴可以去看下。
今天我還會繼續(xù)分享關于搜索的知識點,但是內(nèi)容方面不會有太多進展,好了,下面我們直接看今天的內(nèi)容吧!
elastsearch搜索
精確查找
精確值查找,也就是通過filters進行數(shù)據(jù)過濾,過濾器是es的核心功能,它本身執(zhí)行速度很快,不會計算相關度,而且很容易被緩存。
term查詢
term就屬于filters的一種,可以用它處理數(shù)字(numbers)、布爾值(Booleans)、日期(dates)以及文本(text)。下面我們看下term具體如何使用。
首先,我們假設有這樣一個場景,我們需要查詢公司職員中,年齡為25的所有職工,在傳統(tǒng)數(shù)據(jù)庫中,我們是這樣查詢的:
SELECT *
FROM employee
WHERE age = 25
如果在elasticsearch中,要實現(xiàn)上面的查詢,我們可以這樣操作:
curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query" : {
"constant_score": {
"filter": {
"term" : {
"age" : 25
}
}
}
}
}
'
這里的term語法塊就類似于傳統(tǒng)數(shù)據(jù)庫中的where語句,其中constant_score的意思是以非評分模式來執(zhí)行 term 查詢并以一作為統(tǒng)一評分(_score)。
運行結(jié)果如下:

在測試的過程中,我發(fā)現(xiàn)下面這樣查詢,結(jié)果和上面的結(jié)果是一致的:
curl -X GET "localhost:9200/megacorp/employee/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query" : {
"term" : {
"age" : 25
}
}
}'
返回結(jié)果如下:

也不知道這兩種查詢方式有啥區(qū)別(有的懵逼
)。
好了,關于es的搜索今天就分享這一個知識點,后面等我梳理出相關語法規(guī)則后再來補充相關知識(果然打臉了,兩天沒有梳理完
)
總結(jié)
還是昨天的老調(diào)子,es這個坑確實比較深,我感覺我現(xiàn)在連坑底都沒到,所以后面還需要進一步深入學習,等坑踩到底了,就該往上爬了,所以今天就只能分享這么多了。
下面先說下我要變更es內(nèi)容更新策略的原因,簡單說起來就兩點:
一是目前我確實也對es知之甚少,在不清楚的情況下,分享出來的內(nèi)容,難免脫離實際應用場景,難免誤人子弟,而且吧,我目前還沒有接觸到正式應用場景下的es,很多想法并沒有經(jīng)過驗證,所以好多觀點就比較主觀了;
第二個原因其實和第一個差不多,因為沒有線上的應用需求,所以目前學習效率也不高,加上es又是一個持久戰(zhàn)的學習,而我最近又比較忙,暫時也沒有那么多時間深度學習,所以如果強行更新es相關內(nèi)容的話,最終的結(jié)果很可能是,寫出來的東西我自己都覺得沒意思,沒價值,完全是為了內(nèi)容更新而寫,這樣也就違背了我最開始做內(nèi)容分享的初衷。
綜合上面兩個原因,我最終決定,以后還是繼續(xù)以我比較擅長的java領域為核心進行內(nèi)容創(chuàng)作,至于java之外的內(nèi)容,看個人興趣和掌握程度,如果我興趣比較大,比較喜歡的話(比如linux),那我大概率還是會繼續(xù)分享,因為有錢難買我愿意呀!好了,今天的內(nèi)容就先到這里吧,我們明天開始回歸java的懷抱
!
