Elasticsearch入門
Elasticsearch 是一個高伸縮的開源全文搜索和分析引擎。它可以快速地、近實時的存儲,搜索和分析大規模的數據。一般被用作底層引擎/技術,為具有復雜搜索功能和要求的應用提供強有力的支撐。
Elasticsearch 能夠被用在這些地方:
- 假設有一個在線的商店網站,為了讓客戶搜索到銷售的產品。在這種情況下,可以使用 Elasticsearch 來存儲你的整個產品目錄和庫存,並提供搜索以及自動給他們一些建議。
- 假設想要收集日誌或者交易數據,通過分析、挖掘來尋找趨勢,統計,總結或異常。在這種情況下,可以使用 LogStash(Elasticsearch/Logstash/Kibana棧的一部分)去收集、匯總並解析你的數據,然後通過 LogStash
- 假設運行一個價格提醒平臺,讓價格精明的客戶指定一個規則,如“我有興趣購買一個特定的電子小配件,如果下個月內,有賣家的價格低於$x,我想得到通知”。在這種情況下,你可以把賣家的價格遞交到 Elasticsearch ,使用反向搜索(過濾器),將價格變動與客戶查詢進行匹配,一旦發現匹配結果,則通知客戶。
- 假設有分析(商業智能)需求,希望快速調查,分析,可視化和在大量(考慮百萬或十億條記錄)的數據中查找一個特設的問題。在這種情況下,你可以使用 Elasticsearch
對於本教程的其余部分,會通過 Elasticsearch 的啟動和運行過程指導你初步認識它,並展示一些基本的操作,比如:索引,搜索和修改數據。本教程的結束後,你將會對 Elasticsearch 是什麽以及它的工作原理有了較深的認識。希望你能受到啟發,既能使用它建立復雜的搜索應用程序又能從你的數據中發掘有用的東西。
官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
中文社區:http://elasticsearch.cn/article/
參考文檔:https://github.com/13428282016/elasticsearch-CN/wiki/es-gettting-started
Elasticsearch 版本:5.4
基本概念(Basic Concepts)
有一些概念是Elasticsearch 的核心。從一開始就理解這些概念將大大有助於以後的學習。
近實時(NRT)
Elasticsearch 是一個接近實時的搜索平臺。這意味著從將文檔索引的時間到變得可搜索的時間只有輕微的延遲(通常為1秒)。
集群(Cluster)
集群是一個或多個節點(服務器)的集合,它們聯合起來保存所有的數據,並且可以在所有的節點上進行索引和搜索操作。集群由唯一的名稱標識,默認是"elasticsearch"。由於一個節點僅僅可以屬於一個集群,並根據集群名稱加入集群。所以該名字很重要。
不要在不同的環境中使用一樣的集群名字,否則可能會導致加入錯誤的集群。例如,你可以分別在開發,過渡,生產環境中使用集群名稱, logging-dev , logging-stage 和 logging-prod 。
註意,只有一個節點的集群是有效和完美的。也可以擁有多個獨立的集群,每個集群都有自己獨特的集群名稱。
節點(Node)
節點是一個單一的服務器,是集群的一部分,存儲數據,並參與集群的索引和搜索。和集群一樣,節點也是通過唯一的名字去區分,默認名字是一個隨機的UUID(Universally Unique IDentifier),當服務器啟動的時候就會設置到該節點。如果不想使用默認值,你也可以自定義節點的名稱。名稱對管理員來說十分重要,它可以幫助你區分出集群中的各個服務器和哪些節點相對應。
節點通過配置集群的名稱,就可以加入到指定的集群。默認情況下,節點都加入一個叫 elasticsearch 的集群,這意味著如果你在網絡中啟動了大量的節點並且假如他們都能互相通訊的話,那麽他們將會被自動的加入一個名字叫 elasticsearch 的集群。
索引(Index)
索引是具有某種相似特征的文檔的集合。例如,客戶數據索引,產品目錄索引,以及訂單數據索引。索引由名稱(必須全部為小寫)標識,此名稱用於在對文檔進行索引、搜索、更新和刪除操作時使用。在單個集群中,您可以根據需要定義任意數量的索引。
類型(Type)
一個索引可以定義一個或多個類型。類型是索引的邏輯類別/分區,你怎麽理解都行。通常,為具有一組公共字段的文檔定義一種類型。例如,一個博客平臺,假如將所有數據存儲在單個索引中。在此索引中,可以定義用戶數據類型,博客數據類型以及評論數據類型。
文檔(document)
文檔是可以被索引的基本單位。例如,用一個文檔保存某個客戶的數據,或者保存單個產品的數據,或者保存單個訂單的數據。文檔使用JSON表示。在索引/類型中可以存儲大量文檔。值得註意的是,盡管文檔本質上是存放在索引中,但實際上是被索引/分配到索引中的一個類型中。
分片和副本(shards & replicas)
一個索引可能存儲海量數據,有可能超過單個節點的硬盤容量。例如,某個索引存儲了10億個文檔,占用1TB的硬盤空間,單個節點的硬盤有可能不足以存儲那麽大的數據量,就算可以存儲下,但是可能會降低服務器處理搜索請求的速度。
為了解決這個問題, elasticsearch 提供了分片功能,即將索引細分。創建索引時,可以簡單地定義所需的分片數。每個分片本身就具備索引的全部功能,可以存放在集群中的任何一個節點。
分片很重要,主要原因有兩個:
- 它允許您水平分割/縮放您的內容量
- 它允許你並行地分發操作到多個節點的分片上,從而可以提升性能或吞吐量。
碎片分發的機制,以及它的文檔如何匯總回到搜索請求中完全由Elasticsearch管理,並且對用戶來說是透明的。
在網絡/雲環境中,任何時候都可能發生故障,分片會非常有用,並強烈建議使用故障轉移機制,以防止分片/節點脫機或消失。為此, elasticsearch 允許您將索引的分片復制一份或多份,也就是所謂的復制分片,或簡寫為副本。
副本很重要,主要原因有兩個:
- 如果分片/節點出現故障,則可提供高可用性。因此,要註意,副本與其復制的原始/主分片不能分配在同一節點上。
- 它允許您擴展搜索量/吞吐量,因為可以對所有副本並行執行搜索。
總而言之,每個索引可以分為多個分片。每個索引也可以被復制零次(意味著沒有副本)或多次。一旦復制,每個索引將具有主分片(復制的原始分片)和副分片(主分片的副本)。可以在創建索引時根據索引定義碎片和副本的數量。創建索引後,您可以隨時動態更改副本數,但不能更改事後的分片數。
默認情況下,每個索引都會被分配5個主分片和1一個復制分片,這意味著如果你的集群中有兩個節點,你的索引將會有5個主分片和5個復制分片,總共有10個分片。
每個 elasticsearch 分片是一個 Lucene index ,一個 Lucene 索引中可以有很多的文檔,截至 LUCENE-5843 ,最多2,147,483,519(= Integer.MAX_VALUE - 128) 個文檔. 可以使用 _cat/shards api監視分片大小。
Elasticsearch入門