lucene和elasticsearch的前世今生
lucene钝的,最先進(jìn)及塘、功能最強(qiáng)大的搜索庫封锉,直接基于lucene開發(fā)撕攒,非常復(fù)雜,api復(fù)雜(實現(xiàn)一些簡單的功能烘浦,寫大量的java代碼)抖坪,需要深入理解原理(各種索引結(jié)構(gòu))
elasticsearch,基于lucene闷叉,隱藏復(fù)雜性擦俐,提供簡單易用的restful api接口、java api接口(還有其他語言的api接口)
(1)分布式的文檔存儲引擎
(2)分布式的搜索引擎和分析引擎
(3)分布式握侧,支持PB級數(shù)據(jù)
開箱即用蚯瞧,優(yōu)秀的默認(rèn)參數(shù),不需要任何額外設(shè)置品擎,完全開源
關(guān)于elasticsearch的一個傳說埋合,有一個程序員失業(yè)了,陪著自己老婆去英國倫敦學(xué)習(xí)廚師課程萄传。程序員在失業(yè)期間想給老婆寫一個菜譜搜索引擎甚颂,覺得lucene實在太復(fù)雜了,就開發(fā)了一個封裝了lucene的開源項目秀菱,compass振诬。后來程序員找到了工作,是做分布式的高性能項目的衍菱,覺得compass不夠赶么,就寫了elasticsearch,讓lucene變成分布式的系統(tǒng)脊串。
elasticsearch的核心概念
(1)Near Realtime(NRT):近實時辫呻,兩個意思清钥,從寫入數(shù)據(jù)到數(shù)據(jù)可以被搜索到有一個小延遲(大概1秒);基于es執(zhí)行搜索和分析可以達(dá)到秒級
(2)Cluster:集群放闺,包含多個節(jié)點循捺,每個節(jié)點屬于哪個集群是通過一個配置(集群名稱,默認(rèn)是elasticsearch)來決定的雄人,對于中小型應(yīng)用來說从橘,剛開始一個集群就一個節(jié)點很正常
(3)Node:節(jié)點,集群中的一個節(jié)點础钠,節(jié)點也有一個名稱(默認(rèn)是隨機(jī)分配的)恰力,節(jié)點名稱很重要(在執(zhí)行運維管理操作的時候),默認(rèn)節(jié)點會去加入一個名稱為“elasticsearch”的集群旗吁,如果直接啟動一堆節(jié)點踩萎,那么它們會自動組成一個elasticsearch集群,當(dāng)然一個節(jié)點也可以組成一個elasticsearch集群
(4)Document&field:文檔很钓,es中的最小數(shù)據(jù)單元香府,一個document可以是一條客戶數(shù)據(jù),一條商品分類數(shù)據(jù)码倦,一條訂單數(shù)據(jù)企孩,通常用JSON數(shù)據(jù)結(jié)構(gòu)表示,每個index下的type中袁稽,都可以去存儲多個document勿璃。一個document里面有多個field,每個field就是一個數(shù)據(jù)字段推汽。
product document
{
"product_id": "1",
"product_name": "高露潔牙膏",
"product_desc": "高效美白",
"category_id": "2",
"category_name": "日化用品"
}
(5)Index:索引补疑,包含一堆有相似結(jié)構(gòu)的文檔數(shù)據(jù),比如可以有一個客戶索引歹撒,商品分類索引莲组,訂單索引,索引有一個名稱暖夭。一個index包含很多document锹杈,一個index就代表了一類類似的或者相同的document。比如說建立一個product index鳞尔,商品索引嬉橙,里面可能就存放了所有的商品數(shù)據(jù)早直,所有的商品document寥假。
(6)Type:類型,每個索引里都可以有一個或多個type霞扬,type是index中的一個邏輯數(shù)據(jù)分類糕韧,一個type下的document枫振,都有相同的field,比如博客系統(tǒng)萤彩,有一個索引粪滤,可以定義用戶數(shù)據(jù)type,博客數(shù)據(jù)type雀扶,評論數(shù)據(jù)type杖小。
商品index,里面存放了所有的商品數(shù)據(jù)愚墓,商品document
但是商品分很多種類予权,每個種類的document的field可能不太一樣,比如說電器商品浪册,可能還包含一些諸如售后時間范圍這樣的特殊field扫腺;生鮮商品,還包含一些諸如生鮮保質(zhì)期之類的特殊field
type村象,日化商品type笆环,電器商品type,生鮮商品type
日化商品type:product_id厚者,product_name躁劣,product_desc,category_id库菲,category_name
電器商品type:product_id习绢,product_name,product_desc蝙昙,category_id闪萄,category_name,service_period
生鮮商品type:product_id奇颠,product_name败去,product_desc,category_id烈拒,category_name圆裕,eat_period
每一個type里面,都會包含一堆document
{
"product_id": "2",
"product_name": "長虹電視機(jī)",
"product_desc": "4k高清",
"category_id": "3",
"category_name": "電器",
"service_period": "1年"
}
{
"product_id": "3",
"product_name": "基圍蝦",
"product_desc": "純天然荆几,冰島產(chǎn)",
"category_id": "4",
"category_name": "生鮮",
"eat_period": "7天"
}
(7)shard:單臺機(jī)器無法存儲大量數(shù)據(jù)吓妆,es可以將一個索引中的數(shù)據(jù)切分為多個shard,分布在多臺服務(wù)器上存儲吨铸。有了shard就可以橫向擴(kuò)展行拢,存儲更多數(shù)據(jù),讓搜索和分析等操作分布到多臺服務(wù)器上去執(zhí)行诞吱,提升吞吐量和性能舟奠。每個shard都是一個lucene index竭缝。
(8)replica:任何一個服務(wù)器隨時可能故障或宕機(jī),此時shard可能就會丟失沼瘫,因此可以為每個shard創(chuàng)建多個replica副本抬纸。replica可以在shard故障時提供備用服務(wù),保證數(shù)據(jù)不丟失耿戚,多個replica還可以提升搜索操作的吞吐量和性能湿故。primary shard(建立索引時一次設(shè)置,不能修改膜蛔,默認(rèn)5個)晓锻,replica shard(隨時修改數(shù)量,默認(rèn)1個)飞几,默認(rèn)每個索引10個shard砚哆,5個primary shard,5個replica shard屑墨,最小的高可用配置躁锁,是2臺服務(wù)器。
Elasticsearch的功能卵史,干什么的
1战转、分布式的搜索引擎和數(shù)據(jù)分析引擎
搜索:百度,網(wǎng)站的站內(nèi)搜索以躯,IT系統(tǒng)的檢索
數(shù)據(jù)分析:電商網(wǎng)站槐秧,最近7天牙膏這種商品銷量排名前10的商家有哪些;
新聞網(wǎng)站忧设,最近1個月訪問量排名前3的新聞版塊是哪些
分布式刁标,搜索,數(shù)據(jù)分析
2址晕、全文檢索膀懈,結(jié)構(gòu)化檢索,數(shù)據(jù)分析
全文檢索:我想搜索商品名稱包含牙膏的商品
select * from products where product_name like "%牙膏%"
結(jié)構(gòu)化檢索:我想搜索商品分類為日化用品的商品都有哪些
select * from products where category_id='日化用品'
部分匹配谨垃、自動完成启搂、搜索糾錯、搜索推薦
數(shù)據(jù)分析:我們分析每一個商品分類下有多少個商品
select category_id,count(*) from products group by category_id
3刘陶、對海量數(shù)據(jù)進(jìn)行近實時的處理
分布式:ES自動可以將海量數(shù)據(jù)分散到多臺服務(wù)器上去存儲和檢索
海聯(lián)數(shù)據(jù)的處理:分布式以后胳赌,就可以采用大量的服務(wù)器去存儲和檢索數(shù)據(jù),自然而然就可以實現(xiàn)海量數(shù)據(jù)的處理了
近實時:檢索個數(shù)據(jù)要花費1小時(這就不要近實時匙隔,離線批處理疑苫,batch-processing);在秒級別對數(shù)據(jù)進(jìn)行搜索和分析
跟分布式/海量數(shù)據(jù)相反的:lucene,單機(jī)應(yīng)用缀匕,只能在單臺服務(wù)器上使用纳决,最多只能處理單臺服務(wù)器可以處理的數(shù)據(jù)量
Elasticsearch的適用場景碰逸,能在什么地方發(fā)揮作用
國外
1乡小、維基百科,類似百度百科饵史,牙膏满钟,牙膏的維基百科,全文檢索胳喷,高亮湃番,搜索推薦
2、The Guardian(國外新聞網(wǎng)站)吭露,類似搜狐新聞吠撮,用戶行為日志(點擊,瀏覽讲竿,收藏泥兰,評論)+社交網(wǎng)絡(luò)數(shù)據(jù)(對某某新聞的相關(guān)看法),數(shù)據(jù)分析题禀,給到每篇新聞文章的作者鞋诗,讓他知道他的文章的公眾反饋(好,壞迈嘹,熱門削彬,垃圾,鄙視秀仲,崇拜)
3融痛、Stack Overflow(國外的程序異常討論論壇),IT問題神僵,程序的報錯酌心,提交上去,有人會跟你討論和回答挑豌,全文檢索安券,搜索相關(guān)問題和答案,程序報錯了氓英,就會將報錯信息粘貼到里面去侯勉,搜索有沒有對應(yīng)的答案
4、GitHub(開源代碼管理)铝阐,搜索上千億行代碼
5偏螺、電商網(wǎng)站,檢索商品
6炎咖、日志數(shù)據(jù)分析,logstash采集日志遍蟋,ES進(jìn)行復(fù)雜的數(shù)據(jù)分析(ELK技術(shù),elasticsearch+logstash+kibana)
7螟凭、商品價格監(jiān)控網(wǎng)站虚青,用戶設(shè)定某商品的價格閾值,當(dāng)?shù)陀谠撻撝档臅r候螺男,發(fā)送通知消息給用戶棒厘,比如說訂閱牙膏的監(jiān)控,如果高露潔牙膏的家庭套裝低于50塊錢下隧,就通知我奢人,我就去買
8、BI系統(tǒng)淆院,商業(yè)智能何乎,Business Intelligence。比如說有個大型商場集團(tuán)土辩,BI支救,分析一下某某區(qū)域最近3年的用戶消費金額的趨勢以及用戶群體的組成構(gòu)成,產(chǎn)出相關(guān)的數(shù)張報表脯燃,**區(qū)搂妻,最近3年,每年消費金額呈現(xiàn)100%的增長辕棚,而且用戶群體85%是高級白領(lǐng)欲主,開一個新商場。ES執(zhí)行數(shù)據(jù)分析和挖掘逝嚎,Kibana進(jìn)行數(shù)據(jù)可視化
國內(nèi)
9扁瓢、國內(nèi):站內(nèi)搜索(電商,招聘补君,門戶引几,等等),IT系統(tǒng)搜索(OA挽铁,CRM伟桅,ERP,等等)叽掘,數(shù)據(jù)分析(ES熱門的一個使用場景)
Elasticsearch的特點楣铁,跟其他類似的東西不同的地方在哪里
1、可以作為一個大型分布式集群(數(shù)百臺服務(wù)器)技術(shù)更扁,處理PB級數(shù)據(jù)盖腕,服務(wù)大公司赫冬;也可以運行在單機(jī)上,服務(wù)小公司溃列。
2劲厌、Elasticsearch不是什么新技術(shù),主要是將全文檢索听隐、數(shù)據(jù)分析以及分布式技術(shù)补鼻,合并在了一起,才形成了獨一無二的ES遵绰;lucene(全文檢索)辽幌,商用的數(shù)據(jù)分析軟件(也是有的)增淹,分布式數(shù)據(jù)庫(mycat)椿访。
3、對用戶而言虑润,是開箱即用的成玫,非常簡單,作為中小型的應(yīng)用拳喻,直接3分鐘部署一下ES哭当,就可以作為生產(chǎn)環(huán)境的系統(tǒng)來使用了,數(shù)據(jù)量不大冗澈,操作不是太復(fù)雜钦勘。
4、數(shù)據(jù)庫的功能面對很多領(lǐng)域是不夠用的(事務(wù)亚亲,還有各種聯(lián)機(jī)事務(wù)型的操作)彻采;
特殊的功能,比如全文檢索捌归,同義詞處理肛响,相關(guān)度排名,復(fù)雜數(shù)據(jù)分析惜索,海量數(shù)據(jù)的近實時處理特笋;Elasticsearch作為傳統(tǒng)數(shù)據(jù)庫的一個補(bǔ)充,提供了數(shù)據(jù)庫所不不能提供的很多功能巾兆。
參考
江南一點雨