天天看點

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,歡迎關注公衆号:

Elastic Stack-Elasticsearch介紹

轉載于:https://www.cnblogs.com/wtzbk/p/9552087.html