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 root@101.*.*.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])

 

發佈了9 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章