Elasticsearch 版本:5.4
Elasticsearch快速入門 第1篇:Elasticsearch入門
Elasticsearch快速入門 第2篇:Elasticsearch和Kibana安裝
Elasticsearch快速入門 第3篇:Elasticsearch索引和文檔操作
Elasticsearch快速入門 第4篇:Elasticsearch文檔查詢
Elasticsearch 是一個高伸縮的開源全文檢索搜尋和分析引擎。它可以快速地、近即時的儲存,搜尋和分析大規模的資料。一般被用作底層引擎/技術,為具有複雜搜尋功能和要求的應用提供強有力的支撐。
Elasticsearch 能夠被用在這些地方:
假設有一個線上的商店網站,為了讓客戶搜尋到銷售的產品。在這種情況下,可以使用 Elasticsearch 來儲存你的整個產品目錄和庫存,並提供搜尋以及自動給他們一些建議。
假設想要收集日誌或者交易資料,通過分析、挖掘來尋找趨勢,統計,總結或異常。在這種情況下,可以使用 LogStash(Elasticsearch/Logstash/Kibana棧的一部分)去收集、匯總並解析你的資料,然後通過 LogStash 把這些資料遞交給 Elasticsearch 。一旦 Elasticsearch 取得了資料,你就可以進行搜尋並且彙總你感興趣的資訊。
假設運行一個價格提醒平台,讓價格精明的客戶指定一個規則,如“我有興趣購買一個特定的電子小配件,如果下個月內,有賣家的價格低於$x,我想得到通知”。在這種情況下,你可以把賣家的價格遞交到 Elasticsearch ,使用反向搜尋(過濾器),將價格變動與客戶查詢進行匹配,一旦發現匹配結果,則通知客戶。
假設有分析(商業智慧)需求,希望快速調查,分析,可視化和在大量(考慮百萬或十億條記錄)的資料中尋找一個特設的問題。在這種情況下,你可以使用 Elasticsearch 儲存資料,然後使用 Kibana ( Elasticsearch 棧的一部分)構建自訂儀表板,以便可視化對你重要的資料。另外,你可以使用 Elasticsearch 彙總功能,依靠資料執行複雜的商業智慧查詢。
對於本教程的其餘部分,會通過 Elasticsearch 的啟動和運行過程指導你初步認識它,並展示一些基本的操作,比如:索引,搜尋和修改資料。本教程的結束後,你將會對 Elasticsearch 是什麼以及它的工作原理有了較深的認識。希望你能受到啟發,既能使用它建立複雜的搜尋應用程式又能從你的資料中發掘有用的東西。
基本概念(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監視分區大小。
總結
1、為什麼不用關係型資料庫做搜尋?因為用資料庫來實現搜尋,效能會很差,不能進行分詞搜尋。
2、什麼是全文檢索索引、倒排索引和Lucene?前人已經總結過了,請參考【手把手教你全文檢索索引】Apache Lucene初探
3、Elasticsearch的特點
可以分布式叢集,對海量資料進行近即時的處理;
對使用者而言,開箱即用,非常簡單。如果資料量不大,操作不會太複雜;
具有關係型資料庫沒有的功能,比如全文檢索索引,同義字處理,相關度排名,複雜資料分析,海量資料的近即時處理;
基於lucene,隱藏了複雜性,提供簡單易用的restful api介面、java api介面
4、elasticsearch的核心概念
Cluster:叢集包含多個節點,每個節點屬於哪個叢集是通過配置來決定的(預設是elasticsearch)
Node:叢集中的一個節點,節點預設會自動加入名叫"elasticsearch"的叢集。一個elasticsearch服務就是一個節點,比如一台機器啟動兩個es服務,就有兩個節點。
Index:索引,相當於mysql的資料庫,包含一堆有相似結構的文檔資料。
Type:類型,相當於mysql的表,index中的一個邏輯資料分類。
document:文檔,相當於mysql表中的一行記錄,是es中的最小資料單元。
shard:分區,單台機器無法儲存大量資料,es可以將一個索引中的資料切分為多個shard,分布在多台伺服器上儲存。
replica:副本,為了防止宕機,shard丟失,所以最小的高可用配置,是2台伺服器。