1. 什么是Elasticsearch
1.1 什么是搜索
搜索主要是指站內(nèi)搜索尺棋,也稱為垂直搜索,包括:
- 互聯(lián)網(wǎng)搜索:電商網(wǎng)站、招聘網(wǎng)站燎字、新聞網(wǎng)站等以及各種App內(nèi)的搜索
- IT系統(tǒng)的搜索:OA系統(tǒng)腥椒、項(xiàng)目管理系統(tǒng)內(nèi)的搜索等
- 百度!=搜索,百度只是一個(gè)搜索引擎
1.2 數(shù)據(jù)庫(kù)搜索的局限性
- 性能差候衍,全表掃描笼蛛,尤其是當(dāng)查詢的字段的值是很長(zhǎng)的字符串時(shí),性能會(huì)更差
- 無法滿足業(yè)務(wù)需求蛉鹿,第一條SQL滨砍,匹配不到第4條記錄,第2條SQL也查詢不到第5條記錄
1.3 什么是全文檢索
全文檢索是使用倒排索引技術(shù)實(shí)現(xiàn)的一種搜索方法
Lucene實(shí)現(xiàn)了建立倒排索引妖异、搜索等功能以及各種算法惋戏,對(duì)于開發(fā)人員來說,只要引入lucene的jar包他膳,基于lucene的API進(jìn)行開發(fā)即可响逢。
1.4 什么是Elasticsearch
使用Lucene即可實(shí)現(xiàn)單機(jī)的全文檢索功能,但是無法滿足大數(shù)據(jù)量的搜索棕孙,Elasticsearch是將全文檢索舔亭、數(shù)據(jù)分析以及分布式技術(shù),合并在了一起蟀俊,他就是一個(gè)分布式的钦铺、可以處理海量數(shù)據(jù)的搜索引擎,Elasticsearch集群中的每個(gè)節(jié)點(diǎn)肢预,也是依賴Lucene的职抡。
Elasticsearch基于Lucene開發(fā),有幾下功能:
- 隱藏了Lucene API的復(fù)雜性误甚,提供了簡(jiǎn)單易用的REST API接口和Java API接口
- 分布式的文檔存儲(chǔ)缚甩,支持海量數(shù)據(jù)
- 分布式的搜索引擎和分析引擎
- 開箱即用
- 集群自動(dòng)維護(hù)數(shù)據(jù)的分布、多個(gè)節(jié)點(diǎn)索引的建立和搜索請(qǐng)求到各個(gè)節(jié)點(diǎn)的轉(zhuǎn)發(fā)
- 集群自動(dòng)維護(hù)數(shù)據(jù)的冗余副本窑邦,保證不丟失數(shù)據(jù)
- 封裝了更多的高級(jí)功能擅威,提供了復(fù)雜的搜索、聚合分析冈钦、基于地理位置的搜索等高級(jí)功能
2. Elasticsearch核心概念
Near Realtime(NRT):近實(shí)時(shí)郊丛,從寫入數(shù)據(jù)到數(shù)據(jù)可以被搜索到有一個(gè)小延遲(大概1秒),基于ES執(zhí)行搜索和分析可以達(dá)到秒級(jí)
Cluster:集群瞧筛,包含多個(gè)節(jié)點(diǎn)厉熟,每個(gè)節(jié)點(diǎn)屬于哪個(gè)集群是通過一個(gè)配置(集群名稱,默認(rèn)是elasticsearch)來決定的较幌,對(duì)于中小型應(yīng)用來說揍瑟,剛開始一個(gè)集群就一個(gè)節(jié)點(diǎn)很正常
Node:節(jié)點(diǎn),集群中的一個(gè)節(jié)點(diǎn)乍炉,節(jié)點(diǎn)也有一個(gè)名稱(默認(rèn)是隨機(jī)分配的)绢片,節(jié)點(diǎn)名稱很重要(在執(zhí)行運(yùn)維管理操作的時(shí)候)滤馍,默認(rèn)節(jié)點(diǎn)會(huì)去加入一個(gè)名稱為"elasticsearch"的集群,如果直接啟動(dòng)一堆節(jié)點(diǎn)底循,那么它們會(huì)自動(dòng)組成一個(gè)elasticsearch集群巢株,當(dāng)然一個(gè)節(jié)點(diǎn)也可以組成一個(gè)elasticsearch集群
-
Document&Field:文檔,ES中的最小數(shù)據(jù)單元熙涤,一個(gè)document可以是一條客戶數(shù)據(jù)阁苞,一條商品分類數(shù)據(jù)攘滩,一條訂單數(shù)據(jù)忍抽,通常用JSON數(shù)據(jù)結(jié)構(gòu)表示,每個(gè)index下的type中盐固,都可以去存儲(chǔ)多個(gè)document茸歧,一個(gè)document里面有多個(gè)field倦炒,每個(gè)field就是一個(gè)數(shù)據(jù)字段,例如以下這條描述一個(gè)商品的document
{ "product_id": "1", "product_name": "高露潔牙膏", "product_desc": "高效美白", "category_id": "2", "category_name": "日化用品" }
Index:索引软瞎,包含一堆有相似結(jié)構(gòu)的文檔數(shù)據(jù)逢唤,比如可以有一個(gè)客戶索引,商品分類索引涤浇,訂單索引鳖藕,索引有一個(gè)名稱。一個(gè)index包含很多document只锭,一個(gè)index就代表了一類類似的或者相同的document著恩。比如說建立一個(gè)product index,商品索引蜻展,里面可能就存放了所有的商品數(shù)據(jù)喉誊,所有的商品document。
-
Type:類型纵顾,每個(gè)索引里都可以有一個(gè)或多個(gè)type伍茄,type是index中的一個(gè)邏輯數(shù)據(jù)分類,一個(gè)type下的document施逾,都有相同的field敷矫,比如博客系統(tǒng),有一個(gè)索引汉额,可以定義用戶數(shù)據(jù)type曹仗,博客數(shù)據(jù)type,評(píng)論數(shù)據(jù)type蠕搜,注意:
- ES 5.x中一個(gè)index可以有多種type
- ES 6.x中一個(gè)index只能有一種type
- ES 7.x以后已經(jīng)移除type這個(gè)概念
-
對(duì)于index怎茫、type和document,可以通過以下案例理解
商品index讥脐,里面存放了所有的商品數(shù)據(jù)遭居,商品document
但是商品分很多種類啼器,每個(gè)種類的document的field可能不太一樣旬渠,比如說電器商品俱萍,可能還包含一些諸如售后時(shí)間范圍這樣的特殊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(保質(zhì)期)
每一個(gè)type里面馏慨,都會(huì)包含一堆document:
{ "product_id": "2", "product_name": "長(zhǎng)虹電視機(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天" }
-
index、type写隶、document和field與MySQL的類比
index 數(shù)據(jù)庫(kù) type 表 document 一行記錄 field 一個(gè)字段
mapping:mapping定義了每個(gè)字段的類型等信息倔撞。相當(dāng)于關(guān)系型數(shù)據(jù)庫(kù)中的表結(jié)構(gòu)。
shard:?jiǎn)闻_(tái)機(jī)器無法存儲(chǔ)大量數(shù)據(jù)樟澜,ES可以將一個(gè)索引中的數(shù)據(jù)切分為多個(gè)shard误窖,分布在多臺(tái)服務(wù)器上存儲(chǔ)。有了shard就可以橫向擴(kuò)展秩贰,存儲(chǔ)更多數(shù)據(jù)霹俺,讓搜索和分析等操作分布到多臺(tái)服務(wù)器上去執(zhí)行,提升吞吐量和性能毒费。每個(gè)shard都是一個(gè)lucene index
replica:任何一個(gè)服務(wù)器隨時(shí)可能故障或宕機(jī)丙唧,此時(shí)shard可能就會(huì)丟失,因此可以為每個(gè)shard創(chuàng)建多個(gè)replica副本觅玻。replica可以在shard故障時(shí)提供備用服務(wù)想际,保證數(shù)據(jù)不丟失培漏,多個(gè)replica還可以提升搜索操作的吞吐量和性能。primary shard(建立索引時(shí)一次設(shè)置胡本,不能修改牌柄,默認(rèn)5個(gè)),replica shard(隨時(shí)修改數(shù)量侧甫,默認(rèn)1個(gè))珊佣,默認(rèn)每個(gè)索引10個(gè)shard,5個(gè)primary shard披粟,5個(gè)replica shard咒锻,最小的高可用配置,是2臺(tái)服務(wù)器守屉。