
什么是搜索?
如果使用數(shù)據(jù)庫做搜索會(huì)怎樣?
什么是全文檢索和Lucene
什么是ElasticSearch?
1. 什么是搜索?
百度、google上查詢?nèi)魏涡枰膬?nèi)容信息。這種是通用的搜索。但是百度只是一個(gè)通用的搜索引擎,并不等于搜索。
垂直搜索(站內(nèi)搜索): 在指定領(lǐng)域或內(nèi)容區(qū)域搜索內(nèi)容,
互聯(lián)網(wǎng)的搜索:
? 比如淘寶,拉鉤,今日頭條等。
IT系統(tǒng)的搜索:
? OA軟件,辦公自動(dòng)化軟件,會(huì)議管理,日程管理,項(xiàng)目管理等。
搜索:就是在任何場景下,找尋你想要的信息,這個(gè)時(shí)候,會(huì)輸入一段你想要的關(guān)鍵字,然后就期望找到這個(gè)關(guān)鍵字相關(guān)的信息。
2. 如果使用數(shù)據(jù)庫做搜索會(huì)怎樣?
關(guān)系型數(shù)據(jù)庫: RDBS
select * from a where product_name LIKE "%關(guān)鍵字%"
上面,如果沒有做索引的話,就會(huì)每條記錄都會(huì)去查詢匹配。
建了索引的,可以提高查詢的效率,隨著數(shù)據(jù)的增加的,時(shí)間也會(huì)增加。
另外一個(gè)問題,如果關(guān)鍵詞是嚴(yán)格匹配的。不能將搜索詞拆分開來。盡可能去搜索更多的符合預(yù)期的結(jié)果。
緩存型數(shù)據(jù)庫: NOSQL
3. 全文檢索和Lunence
倒排索引:
詞條,索引
全文檢索:
倒排索引源于實(shí)際應(yīng)用中需要根據(jù)屬性的值來查找記錄。這種索引表中的每一項(xiàng)都包括一個(gè)屬性值和具有該屬性值的各記錄的地址。由于不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(inverted index)。帶有倒排索引的文件我們稱為倒排索引文件,簡稱倒排文件(inverted file)。
倒排索引源于實(shí)際應(yīng)用中需要根據(jù)屬性的值來查找記錄。這種索引表中的每一項(xiàng)都包括一個(gè)屬性值和具有該屬性值的各記錄的地址。由于不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(inverted index)。帶有倒排索引的文件我們稱為倒排索引文件,簡稱倒排文件(inverted file)。
(2)Lucene,就是一個(gè)jar包,里面封裝好的各種倒排索引,以及進(jìn)行搜索的代碼,包括各種算法。我們就用java開發(fā)的時(shí)候,引入lucene jar,然后基于lucene進(jìn)行開發(fā)就可以了。用lucene,我們就可以將已有的數(shù)據(jù)建立縮影,lucene會(huì)在本地磁盤上面,給我們組織縮影的數(shù)據(jù)結(jié)構(gòu),另外的話,我們也可以用lucene提供的功能和api來針對(duì)磁盤上額。
Lucene是封裝了搜索引擎大的功能。
4.什么是ElasticSearch?
數(shù)據(jù)量很大的,多臺(tái)服務(wù)器上存放數(shù)據(jù),
數(shù)據(jù)的搜索
高可用
數(shù)據(jù)量很大的時(shí)候,超過單臺(tái)機(jī)器的承受的能力。必須用多臺(tái)的機(jī)器的搜索和管理。
1.數(shù)據(jù)丟失
如何高性能的建立索引,以及執(zhí)行搜索
特點(diǎn):
1.自動(dòng)維護(hù)數(shù)據(jù)的分布到多個(gè)節(jié)點(diǎn)的索引的建立,還有搜索請(qǐng)求分布到多個(gè)節(jié)點(diǎn)的執(zhí)行。
2.自動(dòng)維護(hù)數(shù)據(jù)的冗余副本,保證說,一些機(jī)器的宕機(jī)了,不會(huì)丟失任何數(shù)據(jù)。
3.封裝了更多的高級(jí)功能,以給我們提供更多高級(jí)的支持,讓我們快速的開發(fā)應(yīng)用,開發(fā)更加復(fù)雜的應(yīng)用。
ElasticSearch介紹
ES功能
使用場景
特點(diǎn)
1. ES的功能
-
分布式的搜索引擎和數(shù)據(jù)分析引擎
搜索,百度,網(wǎng)站的站內(nèi)搜索,IT系統(tǒng)檢索,數(shù)據(jù)分析 分布式、搜索、數(shù)據(jù)分析
-
全文檢索、結(jié)構(gòu)化檢索、數(shù)據(jù)分析
全文檢索: 查詢所有商品的包含mac的商品 select * from products where product_name like "%mac%"
結(jié)構(gòu)化搜索
部分匹配、自動(dòng)完成、搜索糾錯(cuò)、搜索推薦
數(shù)據(jù)分析:數(shù)據(jù)統(tǒng)計(jì)、聚合等
-
對(duì)海量數(shù)據(jù)進(jìn)行近實(shí)時(shí)的處理
分布式:ES自動(dòng)可以將海量數(shù)據(jù)分散到多臺(tái)服務(wù)器上去存儲(chǔ)和檢索。
海量數(shù)據(jù)的處理,分布式以后,就可以采用大量的服務(wù)器去存儲(chǔ)和檢索數(shù)據(jù),自然而然可以實(shí)現(xiàn)海量數(shù)據(jù)的處理。
近實(shí)時(shí):檢索一個(gè)數(shù)據(jù) (離線數(shù)據(jù)批處理 batch-processing)
2. ES的適用場景
維基百科
The Guardian、新聞
Stack Overflow
Github
電商網(wǎng)站、檢索商品
日志數(shù)據(jù)分析、logstash采集日志、ES進(jìn)行復(fù)雜的數(shù)據(jù)分析(ELK)
商品價(jià)格監(jiān)控網(wǎng)站、用戶設(shè)定價(jià)格閾值
BI系統(tǒng)、商業(yè)智能、ES執(zhí)行數(shù)據(jù)分析和挖掘
3. ES特點(diǎn)
可以作為一個(gè)大型的分布式集群(數(shù)百臺(tái)服務(wù)器)技術(shù),處理PB級(jí)數(shù)據(jù),服務(wù)大公司,可以運(yùn)行在單機(jī)上,服務(wù)小公司。
ES不是什么新技術(shù),主要是將全文檢索、數(shù)據(jù)分析以及分布式技術(shù)合并在一起,才形成了獨(dú)一無二的ES.lucene(全文檢索)、商用的數(shù)據(jù)分析軟件、分布式數(shù)據(jù)庫 (mycat)
對(duì)用戶而言,是開箱即用,非常簡單,作為中小型的應(yīng)用,直接3分鐘部署ES,就可以作為生產(chǎn)環(huán)境的系統(tǒng)使用,數(shù)據(jù)量不大,操作不是很復(fù)雜。
數(shù)據(jù)庫的功能面對(duì)很多領(lǐng)域是不夠用的(事務(wù),還有各種聯(lián)機(jī)事務(wù)的操作):特殊的功能,比如全文檢索、同義詞處理、相關(guān)度排名、復(fù)雜數(shù)據(jù)分析、海量數(shù)據(jù)近實(shí)時(shí)處理;ES作為傳統(tǒng)數(shù)據(jù)庫的一個(gè)補(bǔ)充,提供了數(shù)據(jù)庫所不能提供的很多功能。
ES的核心概念
1. Lucene和es的前世今生
2. es的核心概念
3. es的核心概念 vs 數(shù)據(jù)庫核心概念
1. lucene和ES的前世今生
lucene,最先進(jìn)、功能最強(qiáng)大,基于lucene開發(fā)非常復(fù)雜,api復(fù)雜(實(shí)現(xiàn)一些簡單的功能,寫大量的java代碼),需要深入理解原理(各種索引結(jié)構(gòu))
ES,基于lucene,隱藏了復(fù)雜性,提供了簡單易用的restful api接口、java api接口(還有其他語言的api接口)
分布式的文檔存儲(chǔ)引擎
分布式的搜索引擎和分析引擎
分布式、支持PB級(jí)數(shù)據(jù)
開箱即用,優(yōu)秀的默認(rèn)參數(shù),不需要任何額外設(shè)置,完全開源。
2. ES的核心概念
Near Realtime(NRT):近實(shí)時(shí),兩個(gè)意思,從寫入數(shù)據(jù)到數(shù)據(jù)可以被搜索到有一個(gè)小延遲(大概1秒):基于ES執(zhí)行搜索和分析可以達(dá)到秒級(jí)
Cluster:集群:包括多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)屬于哪個(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è)集群。
Document:文檔,ES中最小的數(shù)據(jù)單元,一個(gè)document通常是使用json的數(shù)據(jù)格式表示的。每個(gè)index下的type,都可以存儲(chǔ)多個(gè)document. 一個(gè)document中有很多字段field,一個(gè)field就是一個(gè)數(shù)據(jù)字段。
{
name: "JmyvpeE",
cluster_name: "elasticsearch_youdi",
cluster_uuid: "spAvb2wnQe-xVghYxleJ5A",
version: {
number: "6.2.4",
build_hash: "ccec39f",
build_date: "2018-04-12T20:37:28.497551Z",
build_snapshot: false,
lucene_version: "7.2.1",
minimum_wire_compatibility_version: "5.6.0",
minimum_index_compatibility_version: "5.0.0"
},
tagline: "You Know, for Search"
}
Index:索引,包含一堆相似的結(jié)構(gòu)的文檔數(shù)據(jù)。一個(gè)index包含多個(gè)document,一個(gè)index就代表一類類似的或者相同的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.
商品index,里面存放了所有商品,商品document,但是商品分類有很多種,每個(gè)種類的document的field可能不太一樣,比如電器商品,可能還包含一些售后時(shí)間的field,等等
type,日化商品type,電器商品type
Pid,name,desc,category,
Pid,name,desc,category, serivice_time
Pid,name,desc,category, eat_time
? 每個(gè)type里面都包含一堆document
-
shard: index會(huì)被拆分多個(gè)shard,每個(gè)shard就會(huì)存放這個(gè)index的一部分?jǐn)?shù)據(jù),這些shard會(huì)分散在多臺(tái)服務(wù)器上
優(yōu)點(diǎn):
橫向擴(kuò)展,比如說數(shù)據(jù)增加,可以重新建立多shard的索引
數(shù)據(jù)分布在多個(gè)shard上,多臺(tái)服務(wù)器上,所有的操作,就會(huì)在多臺(tái)服務(wù)器上并行分布式執(zhí)行,提升吞吐量和性能。
-
repi: 如果某個(gè)節(jié)點(diǎn)宕機(jī),一部分?jǐn)?shù)據(jù)徹底丟失。 sahrd其實(shí)叫primary shard,一般簡稱shard,replica其實(shí)叫replica shard,簡稱:replicate
高可用,一個(gè)shard宕機(jī),數(shù)據(jù)不丟失,服務(wù)繼續(xù)提供
提升了搜索這類請(qǐng)求的吞吐量和性能
-
ES核心概念 VS 數(shù)據(jù)庫概念
ES 關(guān)系數(shù)據(jù)庫 Document row Type table index 庫
ES的安裝和使用
ES特點(diǎn)之一就是開箱即用
http://127.0.0.1:9200?pretty
{
name: "JmyvpeE",
cluster_name: "elasticsearch_youdi",
cluster_uuid: "spAvb2wnQe-xVghYxleJ5A",
version: {
number: "6.2.4",
build_hash: "ccec39f",
build_date: "2018-04-12T20:37:28.497551Z",
build_snapshot: false,
lucene_version: "7.2.1",
minimum_wire_compatibility_version: "5.6.0",
minimum_index_compatibility_version: "5.0.0"
},
tagline: "You Know, for Search"
}
name: node名稱 cluster_name 集群名稱
ES的配置文件
修改集群名稱:elastic search.yml