1. 程式人生 > >elasticsearch6.3 +es權威指南+安裝+python3操作es

elasticsearch6.3 +es權威指南+安裝+python3操作es

1. elastic search
    1.1 官網 https://www.elastic.co/cn/products
    1.2 書 《Elasticsearch: 權威指南》 https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

2. Elasticsearch: 權威指南
    2.1 對於什麼是簡單,Clint 有獨特的見解並且他很少出錯,這對 Elasticsearch 從管理、API 設計和日常使用等各個方面的易用性上面產生了很大的影響。
    2.2 這個世界已然被資料淹沒。多年來,我們系統間流轉和產生的大量資料已讓我們不知所措。 現有的技術都集中在如何解決資料倉庫儲存以及如何結構化這些資料。 這些看上去都挺美好,直到你實際需要基於這些資料實時做決策分析的時候才發現根本不是那麼一回事。Elasticsearch 是一個分散式、可擴充套件、實時的搜尋與資料分析引擎。 它能從專案一開始就賦予你的資料以搜尋、分析和探索的能力,這是通常沒有預料到的。 它存在還因為原始資料如果只是躺在磁盤裡面根本就毫無用處。結構化搜尋、資料分析、複雜的語言處理、地理位置和物件間關聯關係等。 我們還將探討如何給資料建模來充分利用 Elasticsearch 的水平伸縮性,以及在生產環境中如何配置和監視你的叢集。
    2.3 寫給任何想要把他們的資料拿來幹活做點事情的人。不管你是新起一專案從頭開始還是為了給遺留系統改造換血, Elasticsearch 都能夠幫助你解決現有問題和開發新的功能,有些可能是你之前沒有想到的功能。
    2.4 Elasticsearch 做了很多努力和嘗試來讓複雜的事情變得簡單,很大程度上來說 Elasticsearch 的成功來源於此。 
    2.5 Wikipedia,Stack Overflow,GitHub 使用 Elasticsearch 對1300億行程式碼進行查詢
    2.6 大部分資料庫在從你的資料中提取可用知識時出乎意料的低效。 當然,你可以通過時間戳或精確值進行過濾,但是它們能夠進行全文檢索、處理同義詞、通過相關性給文件評分麼? 它們從同樣的資料中生成分析與聚合資料嗎?最重要的是,它們能實時地做到上面的那些而不經過大型批處理的任務麼?這就是 Elasticsearch 脫穎而出的地方:Elasticsearch 鼓勵你去探索與利用資料,而不是因為查詢資料太困難,就讓它們爛在資料倉庫裡面。
    2.7 Elasticsearch 是一個開源的搜尋引擎,建立在一個全文搜尋引擎庫 Apache Lucene™ 基礎之上。 Lucene 可以說是當下最先進、高效能、全功能的搜尋引擎庫--無論是開源還是私有。但是 Lucene 僅僅只是一個庫。為了充分發揮其功能,你需要使用 Java 並將 Lucene 直接整合到應用程式中。 更糟糕的是,您可能需要獲得資訊檢索學位才能瞭解其工作原理。Lucene 非常 複雜。Elasticsearch 也是使用 Java 編寫的,它的內部使用 Lucene 做索引與搜尋,但是它的目的是使全文檢索變得簡單, 通過隱藏 Lucene 的複雜性,取而代之的提供一套簡單一致的 RESTful API。
    2.8 Elasticsearch 不僅僅是 Lucene,並且也不僅僅只是一個全文搜尋引擎。 它可以被下面這樣準確的形容:
        一個分散式的實時文件儲存,每個欄位 可以被索引與搜尋
        一個分散式實時分析搜尋引擎
        能勝任上百個服務節點的擴充套件,並支援 PB 級別的結構化或者非結構化資料
    2.9 第一個業務需求就是儲存僱員資料。 這將會以 僱員文件 的形式儲存:一個文件代表一個僱員。儲存資料到 Elasticsearch 的行為叫做 索引 ,但在索引一個文件之前,需要確定將文件儲存在哪裡。一個 Elasticsearch 叢集可以 包含多個 索引 ,相應的每個索引可以包含多個 型別 。 這些不同的型別儲存著多個 文件 ,每個文件又有 多個 屬性 。
    2.10 倒排索引:關係型資料庫通過增加一個 索引 比如一個 B樹(B-tree)索引 到指定的列上,以便提升資料檢索速度。Elasticsearch 和 Lucene 使用了一個叫做 倒排索引 的結構來達到相同的目的。
    2.11 這裡列舉了一些在後臺自動執行的操作:
        分配文件到不同的容器 或 分片 中,文件可以儲存在一個或多個節點中
        按叢集節點來均衡分配這些分片,從而對索引和搜尋過程進行負載均衡
        複製每個分片以支援資料冗餘,從而防止硬體故障導致的資料丟失
        將叢集中任一節點的請求路由到存有相關資料的節點
        叢集擴容時無縫整合新節點,重新分配分片以便從離群節點恢復
    2.12 ElasticSearch 的主旨是隨時可用和按需擴容。 而擴容可以通過購買效能更強大( 垂直擴容 ,或 縱向擴容 ) 或者數量更多的伺服器( 水平擴容 ,或 橫向擴容 )來實現。雖然 Elasticsearch 可以獲益於更強大的硬體裝置,但是垂直擴容是有極限的。 真正的擴容能力是來自於水平擴容--為叢集新增更多的節點,並且將負載壓力和穩定性分散到這些節點中。
    2.13 如果我們啟動了一個單獨的節點,裡面不包含任何的資料和 索引,那我們的叢集就是一個“包含空內容節點的叢集”。
    2.14 一個執行中的 Elasticsearch 例項稱為一個 節點,而叢集是由一個或者多個擁有相同 cluster.name 配置的節點組成, 它們共同承擔資料和負載的壓力。當有節點加入叢集中或者從叢集中移除節點時,叢集將會重新平均分佈所有的資料。當一個節點被選舉成為 主 節點時, 它將負責管理叢集範圍內的所有變更,例如增加、刪除索引,或者增加、刪除節點等。 而主節點並不需要涉及到文件級別的變更和搜尋等操作,所以當叢集只擁有一個主節點的情況下,即使流量的增加它也不會成為瓶頸。 任何節點都可以成為主節點。我們的示例叢集就只有一個節點,所以它同時也成為了主節點。作為使用者,我們可以將請求傳送到 叢集中的任何節點 ,包括主節點。 每個節點都知道任意文件所處的位置,並且能夠將我們的請求直接轉發到儲存我們所需文件的節點。 無論我們將請求傳送到哪個節點,它都能負責從各個包含我們所需文件的節點收集回資料,並將最終結果返回給客戶端。
    2.15 Elasticsearch 的叢集監控資訊中包含了許多的統計資料,其中最為重要的一項就是 叢集健康 , 它在 status 欄位中展示為 green 、 yellow 或者 red 。
        GET /_cluster/health
    2.16 新增索引:往 Elasticsearch 新增資料時需要用到 索引 —— 儲存相關資料的地方。 索引實際上是指向一個或者多個物理 分片 的 邏輯名稱空間 。
    2.17 一個 分片 是一個底層的 工作單元 ,它僅儲存了 全部資料中的一部分。一個分片是一個 Lucene 的例項,以及它本身就是一個完整的搜尋引擎。 我們的文件被儲存和索引到分片內,但是應用程式是直接與索引而不是與分片進行互動。Elasticsearch 是利用分片將資料分發到叢集內各處的。分片是資料的容器,文件儲存在分片內,分片又被分配到叢集內的各個節點裡。 當你的叢集規模擴大或者縮小時, Elasticsearch 會自動的在各節點中遷移分片,使得資料仍然均勻分佈在叢集裡。一個分片可以是 主 分片或者 副本 分片。 索引內任意一個文件都歸屬於一個主分片,所以主分片的數目決定著索引能夠儲存的最大資料量。技術上來說,一個主分片最大能夠儲存 Integer.MAX_VALUE - 128 個文件,但是實際最大值還需要參考你的使用場景:包括你使用的硬體, 文件的大小和複雜程度,索引和查詢文件的方式以及你期望的響應時長。一個副本分片只是一個主分片的拷貝。 副本分片作為硬體故障時保護資料不丟失的冗餘備份,併為搜尋和返回文件等讀操作提供服務。
    2.18 在包含一個空節點的叢集內建立名為 blogs 的索引。 索引在預設情況下會被分配5個主分片, 但是為了演示目的,我們將分配3個主分片和一份副本(每個主分片擁有一個副本分片):
        PUT /blogs
        {
            "settings" : {
              "number_of_shards" : 3,
              "number_of_replicas" : 1
            }
        }

    2.19 在同一個節點上既儲存原始資料又儲存副本是沒有意義的,因為一旦失去了那個節點,我們也將丟失該節點上的所有副本資料。
    2.20 當叢集中只有一個節點在執行時,意味著會有一個單點故障問題——沒有冗餘。 幸運的是,我們只需再啟動一個節點即可防止資料丟失。為了測試第二個節點啟動後的情況,你可以在同一個目錄內,完全依照啟動第一個節點的方式來啟動一個新節點(參考安裝並執行 Elasticsearch)。多個節點可以共享同一個目錄。當你在同一臺機器上啟動了第二個節點時,只要它和第一個節點有同樣的 cluster.name 配置,它就會自動發現叢集並加入到其中。 但是在不同機器上啟動節點的時候,為了加入到同一叢集,你需要配置一個可連線到的單播主機列表。 詳細資訊請檢視最好使用單播代替組播
    2.21 文件元資料 
        一個文件不僅僅包含它的資料 ,也包含 元資料 —— 有關 文件的資訊。 三個必須的元資料元素如下:
        _index
        文件在哪存放
        _type
        文件表示的物件類別
        _id
        文件唯一標識
    2.22 一個文件的 _index 、 _type 和 _id 唯一標識一個文件。 我們可以提供自定義的 _id 值,或者讓 index API 自動生成。
    2.23 樂觀併發控制 Elasticsearch 是分散式的。當文件建立、更新或刪除時, 新版本的文件必須複製到叢集中的其他節點。Elasticsearch 也是非同步和併發的,這意味著這些複製請求被並行傳送,並且到達目的地時也許 順序是亂的 。 Elasticsearch 需要一種方法確保文件的舊版本不會覆蓋新的版本。當我們之前討論 index , GET 和 delete 請求時,我們指出每個文件都有一個 _version (版本)號,當文件被修改時版本號遞增。 Elasticsearch 使用這個 _version 號來確保變更以正確順序得到執行。如果舊版本的文件在新版本之後到達,它可以被簡單的忽略。
    2.24 文件的部分更新 update 請求最簡單的一種形式是接收文件的一部分作為 doc 的引數, 它只是與現有的文件進行合併。物件被合併到一起,覆蓋現有的欄位,增加新的欄位。 
    2.25 與 mget 可以使我們一次取回多個文件同樣的方式, bulk API 允許在單個步驟中進行多次 create 、 index 、 update 或 delete 請求。 如果你需要索引一個數據流比如日誌事件,它可以排隊和索引數百或數千批次。
    2.26 當索引一個文件的時候,文件會被儲存到一個主分片中。 Elasticsearch 如何知道一個文件應該存放到哪個分片中呢?當我們建立文件時,它如何決定這個文件應當被儲存在分片 1 還是分片 2 中呢?首先這肯定不會是隨機的,否則將來要獲取文件的時候我們就不知道從何處尋找了。實際上,這個過程是根據下面這個公式決定的:shard = hash(routing) % number_of_primary_shards ,routing 是一個可變值,預設是文件的 _id ,也可以設定成一個自定義的值。 routing 通過 hash 函式生成一個數字,然後這個數字再除以 number_of_primary_shards (主分片的數量)後得到 餘數 。這個分佈在 0 到 number_of_primary_shards-1 之間的餘數,就是我們所尋求的文件所在分片的位置。
    2.27 搜尋——最基本的工具  我們可以將一個 JSON 文件扔到 Elasticsearch 裡,然後根據 ID 檢索。但 Elasticsearch 真正強大之處在於可以從無規律的資料中找出有意義的資訊——從“大資料”到“大資訊”。Elasticsearch 不只會儲存(stores) 文件,為了能被搜尋到也會為文件新增索引(indexes) ,這也是為什麼我們使用結構化的 JSON 文件,而不是無結構的二進位制資料。文件中的每個欄位都將被索引並且可以被查詢 。不僅如此,在簡單查詢時,Elasticsearch 可以使用 所有(all) 這些索引欄位,以驚人的速度返回結果。這是你永遠不會考慮用傳統資料庫去做的一些事情。
    2.28 空搜尋編輯 搜尋API的最基礎的形式是沒有指定任何查詢的空搜尋 ,它簡單地返回叢集中所有索引下的所有文件:GET /_search
    2.29 Elasticsearch 中的資料可以概括的分為兩類:精確值和全文。精確值 如它們聽起來那樣精確。例如日期或者使用者 ID,但字串也可以表示精確值,例如使用者名稱或郵箱地址。對於精確值來講,Foo 和 foo 是不同的,2014 和 2014-09-15 也是不同的。另一方面,全文 是指文字資料(通常以人類容易識別的語言書寫),例如一個推文的內容或一封郵件的內容。
    2.30 倒排索引編輯 Elasticsearch 使用一種稱為 倒排索引 的結構,它適用於快速的全文搜尋。一個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有一個包含它的文件列表。
    2.31 對映 為了能夠將時間域視為時間,數字域視為數字,字串域視為全文或精確值字串, Elasticsearch 需要知道每個域中資料的型別。這個資訊包含在對映中。如 資料輸入和輸出 中解釋的, 索引中每個文件都有 型別 。每種型別都有它自己的 對映 ,或者 模式定義 。對映定義了型別中的域,每個域的資料型別,以及Elasticsearch如何處理這些域。對映也用於配置與型別有關的元資料。
    2.32 檢視對映 通過 /_mapping ,我們可以檢視 Elasticsearch 在一個或多個索引中的一個或多個型別的對映 。在 開始章節 ,我們已經取得索引 gb 中型別 tweet 的對映:
GET /gb/_mapping/tweet
    2.33 自定義域對映 儘管在很多情況下基本域資料型別 已經夠用,但你經常需要為單獨域自定義對映 ,特別是字串域。
    2.34 複雜核心域型別 除了我們提到的簡單標量資料型別, JSON 還有 null 值,陣列,和物件,這些 Elasticsearch 都是支援的。


3. 部署es
    3.1 作業系統  ubuntu 16.04 2核16g,按量付費。
    3.2 機器配置
        root:2018ESawe
        ssh -o ServerAliveInterval=10 [email protected]*.*.66
    3.3 先安裝jdk 1.8
    3.3 獲取es原始碼
        https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
    3.5 建立使用者,es不能用root使用者啟動,必需建立新使用者
        adduser esuser
        esuser:123BN
        su esuser
    3.4 tar xvf elasticsearch-6.3.1.tar.gz
    3.5 進入./elasticsearch-6.3.1/bin,執行./elasticsearch,log輸出穩定後,表明es啟動成功了。
    3.6 另開一個命令列,以http方式執行rest,以操作es
    3.7 例子:獲取es的基礎資訊 
        curl 'http://localhost:9200/?pretty' 
        curl 'http://localhost:9200/?' 
        兩個任選一個
    3.8 curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
        VERB 適當的 HTTP 方法 或 謂詞 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。
        PROTOCOL http 或者 https`(如果你在 Elasticsearch 前面有一個 `https 代理)
        HOST Elasticsearch 叢集中任意節點的主機名,或者用 localhost 代表本地機器上的節點。
        PORT 執行 Elasticsearch HTTP 服務的埠號,預設是 9200 。
        PATH API 的終端路徑(例如 _count 將返回叢集中文件數量)。Path 可能包含多個元件,例如:_cluster/stats 和 _nodes/stats/jvm 。
        QUERY_STRING 任意可選的查詢字串引數 (例如 ?pretty 將格式化地輸出 JSON 返回值,使其更容易閱讀)
        BODY 一個 JSON 格式的請求體 (如果請求需要的話)
        例如,計算文件數量   curl -XGET 'http://localhost:9200/_count?pretty' -d '{"query":{"match_all":{}}}'
        注意,在有些機器上,執行這個命令可能會報錯,形如"Content-Type header [application/x-www-form-urlencoded] is not supported",加引數
        curl -XGET 'http://localhost:9200/_count?pretty'  -H 'Content-Type: application/json'-d '{"query":{"match_all":{}}}'
        後面的-d可以換行寫,可讀性更好。
        所有的curl命令,都可以進行在kibana執行,形式更簡單一些,比如上述命令就是 GET /_count?pretty

4.kibana:es視覺化
    4.1 安裝kibana
        參考文獻  https://www.elastic.co/guide/en/kibana/6.3/console-kibana.html#console-kibana
        wget https://artifacts.elastic.co/downloads/kibana/kibana-6.3.1-linux-x86_64.tar.gz 
        tar -xzf kibana-6.3.1-linux-x86_64.tar.gz
        cd kibana-6.3.1-linux-x86_64/
    4.2 啟動kibana
        ./bin/kibana
    4.3 kibana埠5601,要ecs的安全組開放這個埠
        瀏覽器開啟 http://101.*.*.66:5601
        注意,要修改配置server.host="0.0.0.0",否則無法從外網訪問。
    4.4 在瀏覽器,開啟dev tools --> console,進入執行介面。
        所有的命令,都在這裡執行。
    4.5 console 執行 "GET _search",獲取es基本資訊  
    4.6 console 執行 "GET /_cat/nodes?v",檢查es節點
    4.7 GET /_cat/indices?v   #列出所有節點
    4.8 建立索引
        4.8.1 PUT /customer?pretty  #建立索引 
        4.8.2 GET /_cat/indices?v   #檢查建立結果
    4.9 建立一個文件,也就是索引一個文件  #索引是動詞,這裡會自動建立一個索引 megacorp
        PUT /megacorp/employee/1
{
    "first_name" : "John",
    "last_name" :  "Smith",
    "age" :        25,
    "about" :      "I love to go rock climbing",
    "interests": [ "sports", "music" ]
}
    4.10 獲取僱員  GET /megacorp/employee/1
    4.11 搜尋僱員
        GET /megacorp/employee/_search?

5. py3 操作 elastic rearch
    5.1 pip3 install elasticsearch
    5.2 一個簡單的demo

#!/usr/bin/env python3
 
from elasticsearch import Elasticsearch
 
es = Elasticsearch([{'host':'localhost','port':9200}])
 
res = es.search()
for i in res:
    print(i,":",res[i])