前言
我們建立一個網站或者一個應用通常都會有搜索的功能,如果我們做的只是用戶量很少的內網項目,並且搜索的字段都是一些內容很簡短的字段,比如名字,編號之類的,那完全可以用數據庫like語句,但是,數據庫like查詢性能非常低,如果搜索的請求多,或者需要搜索的是大文本類型的內容(全文搜索),那么這種搜索的方案是不可取的。
那既然我們要做性能高的全文搜索,這個需求又不能依賴數據庫,只能有我們自己來實現了,但是令我們很受打擊的是全文搜索是很難實現的,我們不僅希望能全文搜索,還希望它足夠穩定足夠快,希望我們的搜索結果有關鍵字高亮,並且能按各種匹配分數來排序,希望它能切換不同的分詞算法來滿足各種分詞需求。所以說,我們想要做一個功能完善,性能強大的全文搜索真的不是那么簡單,而全文搜索又是一個常見的需求,所以市面上已經有一些現成的解決方案了。
這些現成的解決方案開源出來,獲得大量的社區開發者支持,不斷為其開發插件,使其不斷優化和完善,這就成了我們所說的搜索引擎了。
這些搜索引擎正是我們需要的,它可以解決我們遇到的痛點,我們可以直接拿這些開源的搜索引擎來使用,無需關心它如何實現,我們只需要專注我們業務的開發就行了,這樣的話也避免了我們出現重復造輪子的現象了,而且這還是一個很麻煩的輪子。
在這些開源的搜索引擎中有一個特別優秀,市場占有量最大,他就是Lucene。但是隨着分布式應用,微服務應用,雲計算,大數據這些技術的興起,像搜索這樣的非常消耗系統性能的服務也應該把它抽取出來獨立部署為一個服務系統,甚至是一個大型的雲服務。然后根據訪問的壓力,可以橫向擴展做搜索服務的集群,集群中的每個節點的數據都能以一個接近實時的速度來同步數據,並把請求按多種不同的算法來分發到具體的服務節點。而服務化了的搜索引擎能支持RESTful方式請求,並且交互的數據以json這種輕量數據格式。如果我們想讓我們的全文搜索具備以上所提到的這些能力,那只使用Lucene是顯然不夠的,我們還得圍繞着Lucene做大量的事情,這樣的工作量和工作難度可能大多數中小型企業難以承受。但是,往往世界上就有那么一群人,他們很有能力,並且富有分享精神,他們以Lucene為核心構建了一套強大的搜索服務器,當然這些搜索服務器不但具備着搜索引擎本該有的一整套搜索相關的功能,還具備着我們上面所說的這些能力,最重要的是:它們是開源共享的。而它們中最有名氣的就是elasticsearch和solr。其中,elasticsearch就是我們要深入探討的技術。
Elasticsearch是什么
Elasticsearch是一個基於Lucene搜索引擎為核心構建的開源,分布式,RESTful搜索服務器。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便,輕松擴展服務節點。
Elasticsearch是用Java開發的,但它卻不是只支持Java語言,因為它支持RESTful方式調用,那理論上它是支持所有開發語言的,除此之外,如果你不想使用RESTful方式調用Elasticsearch服務器,那Elasticsearch還提供了各種語言的api供我們使用。
我們通過以下這張分析圖來看看elasticsearch是如何工作的:
ES服務器工作示意圖.png
相關概念
接近實時(NRT):
Elasticsearch 是一個接近實時的搜索平台。這意味着,從索引一個文檔直到這個文檔能夠被搜索到有一個很小的延遲,包括如果做了集群的話,集群中的各個節點數據同步也是接近實時的。
集群(cluster):
elasticsearch一個很大的優勢是它可以很方便的做集群,在一個elasticsearch的集群中,有很多的節點(node),其中有一個為主節點,這個主節點是可以通過選舉產生的,主從節點是對於集群內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節點的通信和與整個es集群通信是等價的。
節點(node):
節點(node)其實就是一個elasticsearch服務器的實例,節點(node)主要有3種類型,第一種類型是client_node,主要是起到請求分發的作用,類似路由。第二種類型是master_node,是主的節點,所有的新增,刪除,數據分片都是由主節點操作(elasticsearch底層是沒有更新數據操作的,上層對外提供的更新實際上是刪除了再新增),當然也能承擔搜索操作。第三種類型是date_node,該類型的節點只能做搜索操作,具體會分配到哪個date_node,就是由client_node決定,而data_node的數據都是從master_node同步過來的。
索引(index):
ElasticSearch將它的數據存儲在一個或多個索引(index)中。用SQL領域的術語來類比,索引就像數據庫,可以向索引寫入文檔或者從索引中讀取文檔。
文檔類型(type):
文檔類型(type)是用來規定文檔的各個字段內容的數據類型和其他的一些約束,相當於關系型數據庫中的表,一個索引(index)可以有多個文檔類型(type)。
文檔(document):
在Elasticsearch中,文檔(document)是存儲數據的載體,包含一個或多個字段。一個文檔(document)相當於關系型數據庫中的一行數據。
這些就是elasticsearch的一些比較重要的概念,還有其他的概念我們就不一一列舉了,但是大家通過以上的概念可能發現,elasticsearch的設計跟關系型數據庫的設計還是挺像的,我們可以通過關系型數據庫的概念來類比着學習elasticsearch,所以來看看以下這張對比圖:
MySQL和elasticsearch概念對比.png
那么關於Elasticsearch的介紹叩丁狼老師就先講到這里,下個章節我們就來把Elasticsearch安裝起來使用。
http://www.itpub.net/thread-2104021-1-1.html
Donate捐贈
如果我的文章幫助了你,可以贊賞我 紅包,讓我繼續寫出更好的內容)

(微信) (支付寶)
微信/支付寶 掃一掃
