一、Elasticsearch 簡(jiǎn)介你可以這么形容 Elasticsearch :
Elasticsearch 是一個(gè)實(shí)時(shí)分布式搜索和分析引擎,建立在一個(gè)全文搜索引擎庫(kù) Apache Lucene 基礎(chǔ)之上,而 Lucene 是當(dāng)下最先進(jìn)、高性能、全功能的搜索引擎庫(kù)。 但是 Lucene 僅僅只是一個(gè)庫(kù)。為了充分發(fā)揮其功能,你需要使用 Java 并將 Lucene 直接集成到應(yīng)用程序中。 更糟糕的是,您可能需要獲得信息檢索學(xué)位才能了解其工作原理,因?yàn)?Lucene 非常復(fù)雜。 Elasticsearch 也是使用 Java 編寫的,它的內(nèi)部使用 Lucene 做索引與搜索,但是它的目的是使全文檢索變得簡(jiǎn)單,通過隱藏 Lucene 的復(fù)雜性,取而代之的提供一套簡(jiǎn)單一致的 RESTful API。
Elasticsearch 不僅用于大型企業(yè),它還讓像 DataDog 以及 Klout 這樣的創(chuàng)業(yè)公司將最初的想法變成可擴(kuò)展的解決方案,Elasticsearch 可以在你的筆記本上運(yùn)行,也可以在數(shù)以百計(jì)的服務(wù)器上處理 PB 級(jí)別的數(shù)據(jù)。 二、Elasticsearch 安裝
三、Elasticsearch 基本概念文檔(Document)JSON 格式,Elasticsearch 存儲(chǔ)的最小單位,可以理解為是關(guān)系型數(shù)據(jù)庫(kù)中的一條記錄,每個(gè)文檔都有自己的一個(gè) unique id。 文檔元數(shù)據(jù),用于標(biāo)注文檔的相關(guān)信息
_score 相關(guān)度是一個(gè)很重要的概念,闡明了 Elasticsearch 在全文屬性上搜索并返回相關(guān)性最強(qiáng)的結(jié)果,這是完全區(qū)別于傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)的一個(gè)概念,數(shù)據(jù)庫(kù)中的一條記錄要么匹配要么不匹配。 文檔(Document)是不可變的:它們不能被修改,只能被替換。因此對(duì)于 Document 的所有修改操作,在其內(nèi)部都要經(jīng)歷檢索-修改-重建索引的處理過程。 索引(Index)、類型(Type)索引(Index)是文檔的一個(gè)容器,類比于關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)概念,索引中的 setting 里定義有多少個(gè) shards 來(lái)存儲(chǔ)索引數(shù)據(jù),數(shù)據(jù)是如何分布。
類型(Type)可以理解成關(guān)系型數(shù)據(jù)庫(kù)中的 Table。 因此 每個(gè)索引(Index)包含多個(gè)類型(Type),不同的類型存儲(chǔ)著多個(gè)文檔(Document),每個(gè)文檔又有多個(gè)屬性(Field) 分片、副本一個(gè)運(yùn)行中的 Lucene 實(shí)例稱為一個(gè)分片,分片是數(shù)據(jù)的容器,文檔保存在分片內(nèi),分片又被分配到集群內(nèi)的各個(gè)節(jié)點(diǎn)里。當(dāng)你的集群規(guī)模擴(kuò)大或者縮小時(shí),Elasticsearch 會(huì)自動(dòng)的在各節(jié)點(diǎn)中遷移分片,使得數(shù)據(jù)仍然均勻分布在集群里。 一個(gè)分片可以是主分片或者副本分片。 主分片用于解決水平擴(kuò)展問題,將索引海量數(shù)據(jù)分布到集群內(nèi)所有的節(jié)點(diǎn)之上(默認(rèn)通過 id 的 hash),主分片在索引創(chuàng)建的時(shí)候確定,后續(xù)不允許修改(除非 Reindex 操作進(jìn)行修改)。 副本分片是用于解決高可用問題,當(dāng)主分配出現(xiàn)問題時(shí),副本分片會(huì)被集群升級(jí)為主分片,副本分片個(gè)數(shù)的決定了寫入性能和讀取吞吐量,副本數(shù)量越多寫入性能越差,但讀取吞吐量就會(huì)越高,在運(yùn)行中的集群上是可以動(dòng)態(tài)調(diào)整副本分片數(shù)目的。
如果主分片和副本分片都集中在一個(gè)節(jié)點(diǎn)上,那是沒辦法做到高可用的。ES 的集群監(jiān)控狀態(tài)會(huì)返回 yellow(表示全部主分片都正常運(yùn)行,副本分片沒有全部處在正常狀態(tài))。因此,需要啟動(dòng)更多的節(jié)點(diǎn)來(lái)承載副本分片。 集群、節(jié)點(diǎn)一個(gè)運(yùn)行中的 Elasticsearch 實(shí)例稱為一個(gè)節(jié)點(diǎn),而集群是由一個(gè)或者多個(gè)擁有相同 cluster.name 配置的節(jié)點(diǎn)組成,它們共同承擔(dān)數(shù)據(jù)和負(fù)載的壓力。當(dāng)有節(jié)點(diǎn)加入集群中或者從集群中移除節(jié)點(diǎn)時(shí),集群將會(huì)重新平均分布所有的數(shù)據(jù)。 Master 節(jié)點(diǎn),負(fù)責(zé)管理集群范圍內(nèi)的所有變更,例如增加、刪除索引,或者增加、刪除節(jié)點(diǎn)等,而 Master 節(jié)點(diǎn)并不需要涉及到文檔級(jí)別的變更和搜索等操作。 Data 節(jié)點(diǎn),存儲(chǔ)數(shù)據(jù)節(jié)點(diǎn)。 Coordinating (協(xié)調(diào))節(jié)點(diǎn),負(fù)責(zé)接收客戶端請(qǐng)求,分發(fā)請(qǐng)求到其他節(jié)點(diǎn),最后再將數(shù)據(jù)匯集響應(yīng)給客戶端。集群中得任何節(jié)點(diǎn)都可以作為協(xié)調(diào)節(jié)點(diǎn),包括主節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都知道任意文檔所處的位置。 集群中的節(jié)點(diǎn)通過端口 9300 彼此通信。如果這個(gè)端口沒有打開,節(jié)點(diǎn)將無(wú)法形成一個(gè)集群。 四、Elasticsearch 數(shù)據(jù)和檢索Elasticsearch 是面向文檔的,使用 JSON 作為文檔的序列化格式,而且 Elasticsearch 不僅存儲(chǔ)文檔,還索引每個(gè)文檔的內(nèi)容,使之可以被檢索、排序和過濾,而這也是 Elasticsearch 能支持復(fù)雜全文檢索的原因。 在 Elasticsearch 中, 每個(gè)字段的所有數(shù)據(jù)都是默認(rèn)被索引的。即每個(gè)字段都有為了快速檢索設(shè)置的專用倒排索引。而且,不像其他多數(shù)的數(shù)據(jù)庫(kù),它能在同一個(gè)查詢中使用所有這些倒排索引,并以驚人的速度返回結(jié)果。 我們可以使用 RESTful API 通過端口 9200(默認(rèn))和 Elasticsearch 進(jìn)行通信,可以使用 kibana 訪問 Elasticsearch ,甚至可以直接使用 curl 命令來(lái)和 Elasticsearch 交互。
更多 DSL 語(yǔ)法可以參考:https://www./guide/en/elasticsearch/reference/7.9/search-search.html 如果你正在使用 Java,在代碼中你可以使用 Elasticsearch 內(nèi)置的兩個(gè)客戶端:
兩個(gè) Java 客戶端都是通過 9300 端口并使用 Elasticsearch 的原生傳輸協(xié)議和集群交互。 |
|
來(lái)自: python_lover > 《待分類》