本章將介紹:ElasticSearch的作用,搭建elasticsearch的環境(Windows/Linux),ElasticSearch叢集的搭建,視覺化客戶端外掛elasticsearch-head的安裝及使用,對IK分詞器的安裝及使用。
1.ElasticSearch簡介Elaticsearch,簡稱為es, es是一個開源的高擴充套件的分散式全文檢索引擎,它可以近乎實時的儲存、檢索資料;本 身擴充套件性很好,可以擴充套件到上百臺伺服器,處理PB級別的資料。es也使用Java開發並使用Lucene作為其核心來實 現所有索引和搜尋的功能,但是它的目的是透過簡單的RESTful API來隱藏Lucene的複雜性,從而讓全文搜尋變得 簡單。
1.1ElasticSearch的使用案例2013年初,GitHub拋棄了Solr,採取ElasticSearch 來做PB級的搜尋。 “GitHub使用ElasticSearch搜尋20TB 的資料,包括13億檔案和1300億行程式碼”維基百科:啟動以elasticsearch為基礎的核心搜尋架構SoundCloud:“SoundCloud使用ElasticSearch為1.8億使用者提供即時而精準的音樂搜尋服務”百度:百度目前廣泛使用ElasticSearch作為文字資料分析,採集百度所有伺服器上的各類指標資料及使用者自定義資料,透過對各種資料進行多維分析展示,輔助定位分析例項異常或業務層面異常。目前覆蓋百度內部20多個業務線(包括casio、雲分析、網盟、預測、文庫、直達號、錢包、風控等),單叢集最大100臺機器,200個ES節點,每天匯入30TB+資料新浪使用ES 分析處理32億條實時日誌阿里使用ES 構建挖財自己的日誌採集和分析體系1.2 ElasticSearch與solr的對比Solr 利用 Zookeeper 進行分散式管理,而 Elasticsearch 自身帶有分散式協調管理功能;Solr 支援更多格式的資料,而 Elasticsearch 僅支援json檔案格式;Solr 官方提供的功能更多,而 Elasticsearch 本身更注重於核心功能,高階功能多有第三方外掛提供;Solr 在傳統的搜尋應用中表現好於 Elasticsearch,但在處理實時搜尋應用時效率明顯低於 Elasticsearch2.ElasticSearch安裝(windows)
下載壓縮包:
ElasticSearch的官方地址: https://www.elastic.co/products/elasticsearch
2.1 安裝注意:es使用java開發,使用lucene作為核心,需要配置好java環境!(jdk1.8以上)
類似與tomcat,直接解壓即可。其目錄結構如下:
2.2修改配置檔案修改conf\jvm.option檔案將#-Xms2g #-Xmx2g修改成為:-Xms340m-Xmx340m否則因為虛擬機器記憶體不夠無法啟動
修改conf\elasticsearch.yml檔案
elasticsearch-5.6.8\config\elasticsearch.yml中末尾加入:http.cors.enabled: truehttp.cors.allow-origin: "*"network.host: 127.0.0.1目的是使ES支援跨域請求
2.3 啟動點選ElasticSearch下的bin目錄下的elasticsearch.bat啟動,控制檯顯示的日誌資訊如下:
注意:9300是tcp通訊埠,es叢集之間使用tcp進行通訊,9200是http協議埠。
我們在瀏覽器可以訪問:
2.4 安裝圖形化外掛上述可以發現,ElasticSearch不同於Solr自帶圖形化介面,我們可以透過安裝ElasticSearch的head外掛,完成圖形化介面的效果,完成索引資料的檢視。安裝外掛的方式有兩種,線上安裝和本地安裝。本文件採用本地安裝方式進行head外掛的安裝。elasticsearch-5-*以上版本安裝head需要安裝node和grunt 。
下載head外掛:https://github.com/mobz/elasticsearch-head下載壓縮包後解壓即可。
下載node.js:https://nodejs.org/en/download/雙擊安裝,透過cmd輸入 node -v檢視版本號
將grunt安裝為全域性命令 ,Grunt是基於Node.js的專案構建工具在cmd中輸入:
npm install ‐g grunt‐cli
由於訪問的是國外的伺服器,如果下載速度較慢,可以切換淘寶映象
npm install -g cnpm –registry=https://registry.npm.taobao.org
後續使用的時候,只需要把npm xxx 換成 cnpm xxx 即可
檢測是否安裝成功
npm config get registry
注意:後續使用時需要將npm替換為cnpm。
啟動head進入head外掛目錄,開啟cmd,輸入:
>npm install>grunt server
開啟瀏覽器,輸入http://localhost:9100即可
3.ES相關概念3.1 概述(重要)Elasticsearch是面向文件(document oriented)的,這意味著它可以儲存整個物件或文件(document)。然而它不僅 僅是儲存,還會索引(index)每個文件的內容使之可以被搜尋。在Elasticsearch中,你可以對文件(而非成行成列的資料)進行索引、搜尋、排序、過濾。Elasticsearch比傳統關係型資料庫如下:
Relational DB ‐> Databases ‐> Tables ‐> Rows ‐> Columns Elasticsearch ‐> Indices ‐> Types ‐> Documents ‐> Fields
3.2 核心概念1)index索引-一個索引就是一個擁有幾分相似特徵的文件的集合。比如說,你可以有一個客戶資料的索引,另一個產品目錄的索引,還有一個訂單資料的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文件進行索引、搜尋、更新和刪除的時候,都要使用到這個名字。在一個叢集中,可以定義任意多的索引。可類比mysql中的資料庫
2)type型別在一個索引中,你可以定義一種或多種型別。一個型別是你的索引的一個邏輯上的分類/分割槽,其語義完全由你來定。通常,會為具有一組共同欄位的文件定義一個型別。比如說,我們假設你運營一個部落格平臺並且將你所有的資料儲存到一個索引中。在這個索引中,你可以為使用者資料定義一個型別,為部落格資料定義另一個型別,當然,也可以為評論資料定義另一個型別。 可類比mysql中的表
3)Filed欄位相當於是資料表的欄位,對文件資料根據不同屬性進行的分類標識 。
4)對映mappingmapping是處理資料的方式和規則方面做一些限制,如某個欄位的資料型別、預設值、分析器、是否被索引等等,這些都是對映裡面可以設定的,其它就是處理es裡面資料的一些使用規則設定也叫做對映,按著最優規則處理資料對效能提高很大,因此才需要建立對映,並且需要思考如何建立對映才能對效能更好。相當於mysql中的建立表的過程,設定主鍵外來鍵等等
5)document文件一個文件是一個可被索引的基礎資訊單元。比如,你可以擁有某一個客戶的文件,某一個產品的一個文件,當然,也可以擁有某個訂單的一個文件。文件以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的網際網路資料互動格式。在一個index/type裡面,你可以儲存任意多的文件。注意,儘管一個文件,物理上存在於一個索引之中,文件必須被索引/賦予一個索引的type。 插入索引庫以文件為單位,類比與資料庫中的一行資料
6)叢集cluster一個叢集就是由一個或多個節點組織在一起,它們共同持有整個的資料,並一起提供索引和搜尋功能。一個叢集由 一個唯一的名字標識,這個名字預設就是“elasticsearch”。這個名字是重要的,因為一個節點只能透過指定某個集 群的名字,來加入這個叢集。
7)節點node一個節點是叢集中的一個伺服器,作為叢集的一部分,它儲存資料,參與叢集的索引和搜尋功能。和叢集類似,一 個節點也是由一個名字來標識的,預設情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啟動的 時候賦予節點。這個名字對於管理工作來說挺重要的,因為在這個管理過程中,你會去確定網路中的哪些伺服器對 應於Elasticsearch叢集中的哪些節點。
一個節點可以透過配置叢集名稱的方式來加入一個指定的叢集。預設情況下,每個節點都會被安排加入到一個叫 做“elasticsearch”的叢集中,這意味著,如果你在你的網路中啟動了若干個節點,並假定它們能夠相互發現彼此, 它們將會自動地形成並加入到一個叫做“elasticsearch”的叢集中。
在一個集群裡,只要你想,可以擁有任意多個節點。而且,如果當前你的網路中沒有執行任何Elasticsearch節點, 這時啟動一個節點,會預設建立並加入一個叫做“elasticsearch”的叢集。
8)分片和複製 shards&replicas一個索引可以儲存超出單個結點硬體限制的大量資料。比如,一個具有10億文件的索引佔據1TB的磁碟空間,而任一節點都沒有這樣大的磁碟空間;或者單個節點處理搜尋請求,響應太慢。為了解決這個問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當你建立一個索引的時候,你可以指定你想要的分片的數量。每個分片本身也是一個功能完善並且獨立的“索引”,這個“索引”可以被放置到叢集中的任何節點上。分片很重要,主要有兩方面的原因: 1)允許你水平分割/擴充套件你的內容容量。 2)允許你在分片(潛在地,位於多個節點上)之上進行分散式的、並行的操作,進而提高效能/吞吐量。
至於一個分片怎樣分佈,它的文件怎樣聚合回搜尋請求,是完全由Elasticsearch管理的,對於作為使用者的你來說,這些都是透明的。
在一個網路/雲的環境裡,失敗隨時都可能發生,在某個分片/節點不知怎麼的就處於離線狀態,或者由於任何原因消失了,這種情況下,有一個故障轉移機制是非常有用並且是強烈推薦的。為此目的,Elasticsearch允許你建立分片的一份或多份複製,這些複製叫做複製分片,或者直接叫複製。
複製之所以重要,有兩個主要原因: 在分片/節點失敗的情況下,提供了高可用性。因為這個原因,注意到複製分片從不與原/主要(original/primary)分片置於同一節點上是非常重要的。擴充套件你的搜尋量/吞吐量,因為搜尋可以在所有的複製上並行執行。總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作為複製源的原來的分片)和複製分片(主分片的複製)之別。分片和複製的數量可以在索引建立的時候指定。在索引建立之後,你可以在任何時候動態地改變複製的數量,但是你事後不能改變分片的數量。
預設情況下,Elasticsearch中的每個索引被分片5個主分片和1個複製,這意味著,如果你的叢集中至少有兩個節點,你的索引將會有5個主分片和另外5個複製分片(1個完全複製),這樣的話每個索引總共就有10個分片。
4.ElasticSearch客戶端操作上述部分為理論部分,實際開發中,主要有三種方式可以作為es服務的客戶端:
使用elasticsearch-head外掛使用elasticsearch提供的Restful介面直接訪問使用elasticsearch提供的API進行訪問4.1使用Restful介面直接訪問我們需要使用http請求,介紹兩款介面測試工具:postman和Talend API tester。
Talend API tester安裝:這是一款chrome外掛,無需下載;
Postman安裝:Postman官網:https://www.getpostman.com
4.2使用Talend API tester進行es客戶端操作。1)Elasticsearch的介面語法curl ‐X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' ‐d '<BODY>'
其中:
2)建立索引庫index並新增對映mapping------PUTPUT
請求體:
article:type型別;相當於這個索引庫中有張表叫做article下面定義的這張表中的欄位的定義,
欄位預設為不索引的;
analyzer:分詞器使用標準分詞器
{ "mappings": { "article": { "properties": { "id": { "type": "long", "store": true, "index": "not_analyzed" }, "title": { "type": "text", "store": true, "index": "analyzed", "analyzer": "standard" }, "content": { "type": "text", "store": true, "index": "analyzed", "analyzer": "standard" } } } }}
在視覺化工具elasticsearch-head中檢視:
3)先建立索引index,再新增mapping ----PUT我們可以在建立索引時設定mapping資訊,當然也可以先建立索引然後再設定mapping。 在上一個步驟中不設定maping資訊,直接使用put方法建立一個索引,然後設定mapping資訊。 請求的url:
PUT http://127.0.0.1:9200/hello2/article/_mapping
請求體:
{ "article": { "properties": { "id": { "type": "long", "store": true, "index": "not_analyzed" }, "title": { "type": "text", "store": true, "index": "analyzed", "analyzer": "standard" }, "content": { "type": "text", "store": true, "index": "analyzed", "analyzer": "standard" } } }}
DELETE http://127.0.0.1:9200/hello2
5)建立文件document(向索引庫中新增內容)---POST
請求URL:
POST http://127.0.0.1:9200/hello/article/1
請求體:
{ "id": 1, "title": "ElasticSearch是一個基於Lucene的搜尋伺服器", "content": "它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎。設計用於雲計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。"}
在elasticsearch-head中檢視:
注意,一般我們將_id與id賦相同值。
6)修改document內容----POST請求URL:
POST http://127.0.0.1:9200/hello/article/1
在elasticsearch-head中檢視:
DELETE http://127.0.0.1:9200/hello/article/2
8)查詢文件document-----GET
查詢文件有三種方式:
根據id查詢;根據關鍵詞查詢根據輸入的內容先分詞,再查詢i.根據id查詢請求URL:
GET http://127.0.0.1:9200/hello/article/1
ii.根據關鍵字查詢-term查詢
請求URL:
POST http://127.0.0.1:9200/hello/article/_search
請求體:
{ "query": { "term": { "title": "搜" } }}
iii.查詢文件-querystring查詢請求URL:
POST http://127.0.0.1:9200/hello/article/_search
請求體:
{ "query": { "query_string": { "default_field": "title", "query": "搜尋伺服器" } }}
指定: 在哪個欄位上進行查詢; 要查詢的內容是什麼;
它會把查詢內容先進行分詞,再進行查詢
4.3使用elasticsearch-head進行es客戶端操作在elasticsearch-head中集成了http請求的工具,可以提供複查查詢:
5.IK分詞器和Elasticsearch整合使用上述分詞器使用的是標準分詞器,其對中文分詞不是很友好,例如對我是程式設計師進行分詞得到:
GET http://127.0.0.1:9200/_analyze?analyzer=standard&pretty=true&text=我是程式設計師"tokens":[{"token": "我", "start_offset": 0, "end_offset": 1, "type": "<IDEOGRAPHIC>",…},{"token": "是", "start_offset": 1, "end_offset": 2, "type": "<IDEOGRAPHIC>",…},{"token": "程", "start_offset": 2, "end_offset": 3, "type": "<IDEOGRAPHIC>",…},{"token": "序", "start_offset": 3, "end_offset": 4, "type": "<IDEOGRAPHIC>",…},{"token": "員", "start_offset": 4, "end_offset": 5, "type": "<IDEOGRAPHIC>",…}]
我們希望達到的分詞是:我、是、程式、程式設計師。
支援中文的分詞器有很多,word分詞器,庖丁解牛,Ansj分詞器,下面注意說IK分詞器的使用。
5.1IK分詞器的安裝1)下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
2)解壓,將解壓後的elasticsearch資料夾複製到elasticsearch-5.6.8\plugins下,並重命名資料夾為analysis-ik (其他名字也可以,目的是不要重名)
3)重新啟動ElasticSearch,即可載入IK分詞器
5.2IK分詞器測試IK提供兩種分詞ik_smart和ik_max_word
其中ik_smart為最少切分,ik_max_word為最細粒度劃分。
下面測試一下:
最小切分:在瀏覽器輸入地址:GET http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程式設計師
返回結果:
"tokens":[{"token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR",…},{"token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR",…},{"token": "程式設計師", "start_offset": 2, "end_offset": 5, "type": "CN_WORD",…}]
最新切分:在瀏覽器輸入地址:GET http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程式設計師
返回結果:
"tokens":[{"token": "我", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR",…},{"token": "是", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR",…},{"token": "程式設計師", "start_offset": 2, "end_offset": 5, "type": "CN_WORD",…},{"token": "程式", "start_offset": 2, "end_offset": 4, "type": "CN_WORD",…},{"token": "員", "start_offset": 4, "end_offset": 5, "type": "CN_CHAR",…}]
6.ElasticSearch叢集ES叢集是一個 P2P型別(使用 gossip 協議)的分散式系統,除了叢集狀態管理以外,其他所有的請求都可以傳送到叢集內任意一臺節點上,這個節點可以自己找到需要轉發給哪些節點,並且直接跟這些節點通訊。所以,從網路架構及服務配置上來說,構建叢集所需要的配置極其簡單。在 Elasticsearch 2.0 之前,無阻礙的網路下,所有配置了相同 cluster.name 的節點都自動歸屬到一個叢集中。2.0 版本之後,基於安全的考慮避免開發環境過於隨便造成的麻煩,從 2.0 版本開始,預設的自動發現方式改為了單播(unicast)方式。配置裡提供幾臺節點的地址,ES 將其視作gossip router 角色,藉以完成叢集的發現。由於這只是 ES 內一個很小的功能,所以 gossip router 角色並不需要單獨配置,每個 ES 節點都可以擔任。所以,採用單播方式的叢集,各節點都配置相同的幾個節點列表作為 router即可。
叢集中節點數量沒有限制,一般大於等於2個節點就可以看做是叢集了。一般處於高效能及高可用方面來
慮一般叢集中的節點數量都是3個及3個以上 .
6.1 叢集的搭建(Windows)1)準備三臺elasticsearch伺服器:2)修改每臺伺服器的配置修改\comf\elasticsearch.yml配置檔案:
#Node節點1: http.cors.enabled: truehttp.cors.allow-origin: "*"#節點1的配置資訊:#叢集名稱,保證唯一cluster.name: my-elasticsearch#節點名稱,必須不一樣node.name: node-1#必須為本機的ip地址network.host: 127.0.0.1#服務埠號,在同一機器下必須不一樣http.port: 9201#叢集間通訊埠號,在同一機器下必須不一樣transport.tcp.port: 9301#設定叢集自動發現機器ip集合discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"] #Node節點2: http.cors.enabled: truehttp.cors.allow-origin: "*"#節點1的配置資訊:#叢集名稱,保證唯一cluster.name: my-elasticsearch#節點名稱,必須不一樣node.name: node-2#必須為本機的ip地址network.host: 127.0.0.1#服務埠號,在同一機器下必須不一樣http.port: 9202#叢集間通訊埠號,在同一機器下必須不一樣transport.tcp.port: 9302#設定叢集自動發現機器ip集合discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"] #Node節點3: http.cors.enabled: truehttp.cors.allow-origin: "*"#節點1的配置資訊:#叢集名稱,保證唯一cluster.name: my-elasticsearch#節點名稱,必須不一樣node.name: node-3#必須為本機的ip地址network.host: 127.0.0.1#服務埠號,在同一機器下必須不一樣http.port: 9203#叢集間通訊埠號,在同一機器下必須不一樣transport.tcp.port: 9303#設定叢集自動發現機器ip集合discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
3.啟動各個節點伺服器可以分別啟動每個伺服器下的elasticsearch.bat,我這裡使用的是windows下的批處理檔案:
新建一個elasticsearch_cluster_start.bat檔案,然後新增下面內容:
格式為:start "需要啟動的檔名" "檔案的路徑" &表示啟動A後繼續執行。
start "elasticsearch.bat" "F:\Soft\ES-cluster\cluster01\bin\elasticsearch.bat" &start "elasticsearch.bat" "F:\Soft\ES-cluster\cluster02\bin\elasticsearch.bat" &start "elasticsearch.bat" "F:\Soft\ES-cluster\cluster03\bin\elasticsearch.bat"
關於Windows的批處理在本章就不細說了。
4.叢集測試只要連線叢集中的任意節點,其操作方式與單機版本基本相同,改變的僅僅是儲存的結構。
新增索引和對映
PUT http://127.0.0.1:9201/hello
請求體:
{ "mappings": { "article": { "properties": { "id": { "type": "long", "store": true, "index": "not_analyzed" }, "title": { "type": "text", "store": true, "index": true, "analyzer": "ik_smart" }, "content": { "type": "text", "store": true, "index": true, "analyzer": "ik_smart" } } } }}
返回結果:
{"acknowledged": true,"shards_acknowledged": true,"index": "hello"}
新增文件
POST http://127.0.0.1:9201/hello/article/1
請求體:
{"id":1,"title":"ElasticSearch是一個基於Lucene的搜尋伺服器","content":"它提供了一個分散式多使用者能力的全文搜尋引擎,基於RESTful web介面。Elasticsearch是用Java開發的,並作為Apache許可條款下的開放原始碼釋出,是當前流行的企業級搜尋引擎。設計用於雲計算中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用方便。"}
返回值:
{"_index": "hello","_type": "article","_id": "1","_version": 1,"result": "created","_shards":{"total": 2,"successful": 2,"failed": 0},"created": true}
在elasticsearch-head中檢視:
7.ElasticSearch安裝(Linux)1)保證你已經安裝了java環境可以直接把windows中的copy過去,不用安裝,解壓即可。
tar -zxf elasticsearch-6.3.2.tar.gz
2)修改配置檔案修改conf\jvm.option檔案
將#-Xms2g #-Xmx2g修改成為:-Xms340m-Xmx340m否則因為虛擬機器記憶體不夠無法啟動
修改conf\elasticsearch.yml檔案
#elasticsearch-5.6.8\config\elasticsearch.yml中末尾加入:http.cors.enabled: truehttp.cors.allow-origin: "*"network.host: 127.0.0.1目的是使ES支援跨域請求
3)啟動注意:在linux環境下不支援root使用者直接啟動(理由是安全問題)
新增使用者:[root@coderxz bin]# useradd rxz -p rongxianzhao[root@coderxz bin]# chown -R rxz:rxz /usr/local/elasticsearch/*[root@coderxz bin]# su rxz
執行:
#注意:切換為非root使用者執行哦[rxz@coderxz bin]$ ./elasticsearch
檢視執行狀態:
檢測是否執行:jps (顯示所有的Java程序pid的命令) ps aux|grep elasticsearch [root@coderxz ~]# curl -X GET 'http://localhost:9200'
4)配置外網訪問9200埠 需要開放伺服器的埠
修改配置檔案 config/elasticsearch.yml
network.host: 0.0.0.0
5)後臺啟動如果你在伺服器上安裝Elasticsearch,而你想在本地機器上進行開發,這時候,你很可能需要在關閉終端的時候,讓Elasticsearch繼續保持執行。最簡單的方法就是使用nohup。先按Ctrl + C,停止當前執行的Elasticsearch,改用下面的命令執行Elasticsearch。
nohup ./bin/elasticsearch&
原文連線:https://www.cnblogs.com/coderxz/p/13268417.html