摘要:倒排索引我們將需要掃描檢索的內(nèi)容的每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當用戶查詢時,根據(jù)事先建立的索引進行查找,并將查找的結(jié)果反饋給用戶。
ES概述 1、什么是Elasticsearch (是什么?)
什么是ElasticSearch呢,首先看看百度百科上的解釋:
ElasticSearch是一個基于的搜索服務(wù)器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口;ElasticSearch 是一個分布式、高擴展、高實時的搜索與數(shù)據(jù)分析引擎。它能很方便的使大量數(shù)據(jù)具有搜索、分析和探索的能力。充分利用ElasticSearch的水平伸縮性,能使數(shù)據(jù)在生產(chǎn)環(huán)境變得更有價值。
從上面的解釋中,我們可以知道:
ES是一個基于Lucene的實時分布式搜索和分析引擎,但隱藏了Lucene的復(fù)雜性,為使用者提供了簡單易用的restful api接口、java api接口(包括其他語言的api接口)。
這里有幾個概念我們需要了解:
1.1什么是搜索?講到搜索,大部分人可能會想到百度、谷歌等,比如我想看電影,一般會先打開百度,然后輸入電影名,進行搜索;
搜索,就是在任何場景下,找尋你想要的信息,這個時候,會輸入一段你要搜索的關(guān)鍵字,然后就期望找到這個關(guān)鍵字相關(guān)的有些信息,如:
1)互聯(lián)網(wǎng)的搜索:電商網(wǎng)站(天貓),招聘網(wǎng)站(Boss),各種app
2)IT系統(tǒng)的搜索:OA系統(tǒng),會議管理等。
Lucene說白了就是一個jar包,里面包含了封裝好的各種建立倒排索引,以及進行搜索的代碼,包括各種算法。我們在開發(fā)的時候,引入lucene jar,然后基于lucene的api進行去進行開發(fā)就可以了。
倒排索引:我們將需要掃描檢索的內(nèi)容的每一個詞建立一個索引,指明該詞在文章中出現(xiàn)的次數(shù)和位置,當用戶查詢時,根據(jù)事先建立的索引進行查找,并將查找的結(jié)果反饋給用戶。我們可以想象成通過字典中的檢索字表查字的過程。
1)新聞網(wǎng)站,用戶行為日志(點擊,瀏覽,收藏等)+ 社交網(wǎng)絡(luò)數(shù)據(jù)(對某某新聞的相關(guān)看法),數(shù)據(jù)分析,給到每篇新聞文章的作者,讓他知道他的文章的公眾反饋(好,壞,熱門,垃圾,鄙視,崇拜)。
2)Stack Overflow(國外的程序異常討論論壇),IT問題,程序的報錯,提交上去,有人會跟你討論和回答,全文檢索,搜索相關(guān)問題和答案,程序報錯了,就會將報錯信息粘貼到里面去,搜索有沒有對應(yīng)的答案。
3)國內(nèi):站內(nèi)搜索(電商,招聘,門戶,等等),IT系統(tǒng)搜索(OA,CRM,ERP,等等),數(shù)據(jù)分析(ES熱門的一個使用場景)。
1)可以上百臺服務(wù)器,處理PB級數(shù)據(jù),服務(wù)大公司;也可以運行在單機上,服務(wù)小公司;
2)Elasticsearch不是什么新技術(shù),主要是將全文檢索、數(shù)據(jù)分析以及分布式技術(shù),合并在了一起,才形成了獨一無二的ES;
3)對用戶而言,是透明的,開箱即用,非常簡單,作為中小型的應(yīng)用,直接3分鐘部署一下ES,就可以作為生產(chǎn)環(huán)境的系統(tǒng)來使用了;
4)數(shù)據(jù)庫的功能面對很多領(lǐng)域是不夠用的(事務(wù),還有各種聯(lián)機事務(wù)型的操作);特殊的功能,比如全文檢索,同義詞處理,相關(guān)度排名,復(fù)雜數(shù)據(jù)分析,海量數(shù)據(jù)的近實時處理;Elasticsearch作為傳統(tǒng)數(shù)據(jù)庫的一個補充,提供了數(shù)據(jù)庫所不能提供的很多功能。
當我們啟動ElasticSearch后,它會利用多播或者單播模式去集群中尋找其它節(jié)點,并和節(jié)點建立連接。整個過程如下圖所示:
2、核心概念 2.1 近實時近實時,從寫入數(shù)據(jù)到數(shù)據(jù)可以被搜索到有一個小延遲(大概1秒);基于es執(zhí)行搜索和分析可以達到秒級。
2.2 集群集群包含多個節(jié)點,可以配置每個節(jié)點屬于哪個集群(集群名稱,默認是elasticsearch),對于中小型應(yīng)用來說,剛開始一個集群可能就一個節(jié)點。
2.3 Node(節(jié)點)集群中的一個節(jié)點,節(jié)點也有一個名稱(默認隨機分配的),節(jié)點名稱很重要(在執(zhí)行運維管理操作的時候),默認節(jié)點會去加入一個名稱為“elasticsearch”的集群,如果直接啟動一堆節(jié)點,那么它們會自動組成一個elasticsearch集群。
2.4 Index(索引-數(shù)據(jù)庫)索引包含一堆有相似結(jié)構(gòu)的文檔數(shù)據(jù),比如可以有一個客戶索引,商品分類索引,索引有一個名稱。一個index就代表了一類類似的或者相同的document。比如說建立一個商品索引,里面可能就存放了所有的商品數(shù)據(jù),類似傳統(tǒng)數(shù)據(jù)庫的數(shù)據(jù)庫。
2.5 Type(類型-表)每個索引里都可以有一個或多個type,type是index中的一個邏輯數(shù)據(jù)分類,一個type下的document,都有相同的field,比如博客系統(tǒng),有一個索引,可以定義用戶數(shù)據(jù)type,博客數(shù)據(jù)type,評論數(shù)據(jù)type,類似傳統(tǒng)數(shù)據(jù)庫中的表。
2.6 Document(文檔-行)文檔是es中的最小數(shù)據(jù)單元,一個document可以是一條客戶數(shù)據(jù),一條商品分類數(shù)據(jù),通常用JSON數(shù)據(jù)結(jié)構(gòu)表示,類似傳統(tǒng)數(shù)據(jù)庫中的一條數(shù)據(jù)記錄,如:
{ "product_id": "1", "product_name": "黑人牙膏", "product_desc": "高效美白", "category_id": "2", "category_name": "生活用品" }2.7 Field(字段-列)
Field是Elasticsearch的最小單位。一個document里面有多個field,每個field就是一個數(shù)據(jù)字段。
2.8 mapping(映射-約束)數(shù)據(jù)如何存放到索引對象上,需要有一個映射配置,包括:數(shù)據(jù)類型、是否存儲、是否分詞等。創(chuàng)建Mapping 的代碼示例如下:
client.indices.putMapping({ ????index : "blog", ????type : "article", ????body : { ????????article: { ????????????properties: { ????????????????id: { ????????????????????type: "string", ????????????????????analyzer: "ik", ????????????????????store: "yes", ????????????????}, ????????????????title: { ????????????????????type: "string", ????????????????????analyzer: "ik", ????????????????????store: "no", ????????????????}, ????????????????content: { ????????????????????type: "string", ????????????????????analyzer: "ik", ????????????????????store: "yes", ????????????????} ????????????} ????????} ????} });2.9分片和復(fù)制
分片:一個索引可以存儲超出單個結(jié)點硬件限制的大量數(shù)據(jù)。比如,一個具有10億文檔的索引占據(jù)1TB的磁盤空間,而任一節(jié)點都沒有這樣大的磁盤空間;或者單個節(jié)點處理搜索請求,響應(yīng)太慢。
為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你創(chuàng)建一個索引的時候,你可以指定你想要的分片的數(shù)量。每個分片本身也是一個功能完善并且獨立的“索引”,這個“索引”可以被放置到集群中的任何節(jié)點上。
分片之所以重要,主要有兩方面的原因:
1) 允許你水平分割/擴展你的內(nèi)容容量
2) 允許你在分片(潛在地,位于多個節(jié)點上)之上進行分布式的、并行的操作,進而提高性能/吞吐量
至于一個分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對于作為用戶的你來說,這些都是透明的。
復(fù)制:在一個網(wǎng)絡(luò)/云的環(huán)境里,失敗隨時都可能發(fā)生,在某個分片/節(jié)點不知怎么的就處于離線狀態(tài),或者由于任何原因消失了。這種情況下,有一個故障轉(zhuǎn)移機制是非常有用并且是強烈推薦的。為此目的,Elasticsearch允許你創(chuàng)建分片的一份或多份拷貝,這些拷貝叫做復(fù)制分片,或者直接叫復(fù)制。復(fù)制之所以重要,主要有兩方面的原因:
1)在分片/節(jié)點失敗的情況下,提供了高可用性。因為這個原因,注意到復(fù)制分片從不與原/主要(original/primary)分片置于同一節(jié)點上是非常重要的。
2)擴展你的搜索量/吞吐量,因為搜索可以在所有的復(fù)制上并行運行
總之,每個索引可以被分成多個分片。一個索引也可以被復(fù)制0次或多次。一旦復(fù)制了,每個索引就有了主分片(作為復(fù)制源的原來的分片)和復(fù)制分片(主分片的拷貝)之別。分片和復(fù)制的數(shù)量可以在索引創(chuàng)建的時候指定。在索引創(chuàng)建之后,你可以在任何時候動態(tài)地改變復(fù)制數(shù)量,但是不能改變分片的數(shù)量。
默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個復(fù)制,這意味著,如果你的集群中至少有兩個節(jié)點,你的索引將會有5個主分片和另外5個復(fù)制分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。一個索引的多個分片可以存放在集群中的一臺主機上,也可以存放在多臺主機上,這取決于你的集群機器數(shù)量。主分片和復(fù)制分片的具體位置是由ES內(nèi)在的策略所決定的。
鏈接: https://www.elastic.co/products/elasticsearch3.2 常用插件
Elasticsearch只是提供各種后端api,為了直觀使用,安裝好Elasticsearch后,需要安裝幾個插件:
1)Elasticsearch-Head插件,可以進行界面化操作的集群管理工具,
下載:https://github.com/mobz/elasticsearch-head
安裝好head插件后,輸入http://ip:9200,如果能看到下面的界面,代表你已經(jīng)安裝成功,可以開心快樂的使用了:
此時我們可以看到訪問地址后面,有個“集群健康值”,但由于我這里ES服務(wù)還沒啟動,所以這里是未連接的狀態(tài);
集群健康值的幾種狀態(tài)如下:
綠色,最健康的狀態(tài),代表所有的分片包括備份都可用 黃色,基本的分片可用,但是備份不可用(也可能是沒有備份) 紅色,部分的分片可用,表明分片有一部分損壞。此時執(zhí)行查詢部分數(shù)據(jù)仍然可以查到,遇到這種情況,還是趕快解決比較好 灰色,未連接到elasticsearch服務(wù)
我們啟動Es服務(wù),重新打開head插件看看,此時,健康值處于綠色狀態(tài):
2)IK中文分詞器,下載:https://github.com/medcl/elas...
IK分詞器有兩種拆分方式
a、ik_smart: 將文本做最粗粒度的拆分 b、ik_max_word: 將文本做最細粒度的拆分
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75072.html
閱讀 2348·2021-11-15 11:37
閱讀 2625·2021-09-23 11:21
閱讀 2951·2021-09-07 10:11
閱讀 3164·2019-08-30 15:53
閱讀 2826·2019-08-29 15:13
閱讀 1606·2019-08-26 13:57
閱讀 1098·2019-08-26 12:23
閱讀 2438·2019-08-26 11:51