Elastic Stack-Elasticsearch介紹


一、前言

    前篇寫了好像沒有多少人去看,但是還是要繼續,我猜想可能是很多人接觸的這塊比較少吧,Elasticsearch這塊有很多要說的,開始吧。

二、數據庫、Elasticsearch選擇

    傳統的數據由於采用的是B+樹的索引,當數據量很大很大的時候,例如單表1Y以上的時候當我們在想做like操作的時候,這個是由於like操作會引起全表檢索,這個時候非常影響我們查詢的效率,當出現這種狀況的時候我們就需要考慮下Elasticsearch,沒錯這就是一個為搜索而生的,Elasticsearch采用的是倒排索引,這里先不要明白什么是倒排索引,下一篇我會比較詳細介紹的,這里你有又會問Elasticsearch這么牛逼我們為什么不把它當做持久化DB?這個問題沒個人有每個人的看法,只要理由合適就可以,我認為是可以得,但是這里我們要考慮到事務這個特性,傳統的數據庫是支持ACID,但是在Elasticsearch是不支持的,如果說你的應用不考慮到這點,我支持你使用Elasticsearch作為DB,如果還是要考慮到這些事務的問題,那么我建議你還是將Elasticsearch考慮作為一個搜索和查詢展示的工具,這個是我的一些看法,大家有不同意見可以探討;

三、Elasticsearch介紹

     Elasticsearch 是一個分布式的搜索和分析引擎,可以用於全文檢索、結構化檢索和分析,並能將這三者結合起來。Elasticsearch是一個基於Apache Lucene的開源搜索引擎。無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、性能最好的、功能最全的搜索引擎庫。Wikipedia、Stack Overflow、GitHub 等都基於 Elasticsearch 來構建他們的搜索引擎。

四、Elasticsearch相關概念介紹

    集群(Cluster)

    一個集群包含一個或多個節點,用來保存全部數據,並且這些節點聯合提供索引和搜索能力。集群使用唯一名稱進行不同集群間的區分,默認名稱是”elasticsearch”。

    節點(Node)

   一個Elasticsearch運行實例,是集群的構成單元。集群中的節點,也有唯一標識的,默認在節點啟動的時候會隨機指定一個UUID。如果不使用默認名稱,可以為其指定一個名稱,當想要加入某個集群的時候也必須要指定集群的名稱;接下來我們還要介紹下節點的類型:

   候選主節點(Master-eligible node)

   一個節點啟動后,就會使用Zen Discovery機制去尋找集群中的其他節點,並與之建立連接。集群中會從候選主節點中選舉出一個主節點,主節點負責創建索引、刪除索引、分配分片、追蹤集群中的節點狀態等工作。正常情況下,一個集群中只有一個選舉出來的主節點,當主節點由於網絡或者負載過大停止響應,此時就需要重新選舉主節點,這時可能會出現集群中有多個主節點的現象,即節點對集群狀態的認知不一致,稱之為腦裂現象。這也就是為什么候選主節點要為單數的情況的原因;這里我建議候選主節點不要存放數據,配置如下:

node.master = true
node.data = false
View Code

   數據節點(Data node)

   數據節點主要存放索引相關數據的分片,負責數據的存儲和相關具體操作,比如CRUD、搜索、聚合等。

node.master = false
node.data = true
View Code

   主要介紹這來兩種,剩下的大家參考官方文檔

   索引(index)

   索引就是相當於Mysql里的Database,存儲文檔結構相同的類型的集合;

   文檔(documnet)

   文檔是索引的基礎信息單元,相當於Mysql中的行,文檔與JSON的形式表現,

   Document MetaData(元數據)

   1._index:文檔所在的索引名,多索引查詢時,有時候只需要在特地索引名上進行查詢,_index字段提供了便利。_index是一個虛擬字段,不會真的加到Lucene索引中。

   2._type:文檔所在的類型名,可以根據_type進行查詢、聚合、腳本和排序。

   3._id: 文檔唯一 id;

   4._uid: 組合id,由_type 和_id 組成;

   5._source:文檔的原始Json數據,可以從這里獲取每個字段的內容。默認_source字段是開啟的,也可以關閉:

   6._all: 字段拼接在一起,將所有的字段用空格分開,_all字段會被解析和索引,但是不存儲。當你只想返回包含某個關鍵字的文檔但是不明確地搜某個字段的時候就需要使用_all字段。 默認禁用;

   7._parent:指定同一索引中文檔的父子關系;

   8._routing:_routing值是文檔的_id或者_parent,通過_routing參數可以設置自定義路由;

   類型(type)

   索引中可以定義一種或多種類型。類型是索引的一個邏輯上的分類;

   字段(field)

   字段是Elasticsearch里面最小的單元,相當於Mysql的列,類似於JSON中的一個鍵,字段類型:

   字符串: text keyword(不分詞);

   數值類型: long integer short(-32,768至32768) byte(-128至127) double float half_float(16位半精度) scaled_float縮放類型的的浮點數(比如價格只需要精確到分,price為88.88的字段縮放因子為100,存起來就是8888);

   布爾型: boolean;

   日期: date;

   二進制: binary;

   范圍類型: integer_range float_range long_range double_range date_range;

   分片(shards)

   Elasticsearch將索引分成若干份,默認是5個分片,每個部分是一個分片,每個分片存在不同節點上,一個節點不能存在相同的分片,每個文檔通過文檔id進行Hash決定放到那個節點上,每個分片都是一個獨立的Lucene實例;

   副本(replicas)

   索引的一份或者多份拷貝,默認是1份,主要作用是容災作用,防止分片丟失后,副本分片會成為主分片,保證數據不會丟失,另外提升查詢性能;

五、下節預告

    下次一篇介紹索引的創建、查詢原理、分詞器等,歡迎點贊,歡迎加群438836709,歡迎關注公眾號:

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM