[西柚仔]認識ElasticSearch及詳細安裝教學

2020-08-10 14:06:11

1. 什麼是RestFul

REST : 表現層狀態轉化(Representational State Transfer),如果一個架構符合REST原則,就稱它爲 RESTful 架構風格。

資源: 所謂"資源",就是網路上的一個實體,或者說是網路上的一個具體資訊

表現層 :我們把"資源"具體呈現出來的形式,叫做它的"表現層"(Representation)。

狀態轉化(State Transfer):如果用戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生"狀態轉 化"(State Transfer)。而這種轉化是建立在表現層之上的,所以就是"表現層狀態轉化"。

REST原則就是指一個URL代表一個唯一資源,並且通過HTTP協定裏面四個動詞:GET、POST、PUT、DELETE對應四種伺服器端的基本操作: GET用來獲取資源,POST用來新增資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源。

2. 什麼是全文檢索

全文檢索是計算機程式通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置。當使用者查詢時根據建立的索引查詢,類似於通過字典的檢索字表查字的過程。

檢索: 索(建立索引) 檢:(檢索索引)

全文檢索(Full-Text Retrieval(檢索))以文字作爲檢索物件,找出含有指定詞彙的文字。全面、準確和快速是衡量全文檢索系統的關鍵指標。

關於全文檢索,我們要知道:

1. 只處理文字。

2. 不處理語意。

3. 搜尋時英文不區分大小寫。

4. 結果列表有相關度排序。

3. 什麼是Elastic Search

ElasticSearch 簡稱 ES是基於Apache Lucene構建的開源搜尋引擎,是當前流行的企業級搜尋引擎。Lucene本身就可以被認爲迄今爲止效能最好的一款開源搜尋引擎工具包,但是lucene的API相對複雜,需要深厚的搜尋理論。很難整合到實際的應用中去。但是ES是採用java語言編寫,提供了簡單易用的RestFul API,開發者可以使用其簡單的RestFul API,開發相關的搜尋功能,從而避免lucene的複雜性


4. ES的誕生

多年前,一個叫做Shay Banon的剛結婚不久的失業開發者,由於妻子要去倫敦學習廚師,他便跟着也去了。在他找工作的過程中,爲了給妻子構建一個食譜的搜尋引擎,他開始構建一個早期版本的Lucene。

直接基於Lucene工作會比較困難,所以Shay開始抽象Lucene程式碼以便Java程式設計師可以在應用中新增搜尋功能。他發佈了他的第一個開源專案,叫做「Compass」。

後來Shay找到一份工作,這份工作處在高效能和記憶體數據網格的分佈式環境中,因此高效能的、實時的、分佈式的搜尋引擎也是理所當然需要的。然後他決定重寫Compass庫使其成爲一個獨立的服務叫做Elasticsearch。

第一個公開版本出現在2010年2月,在那之後Elasticsearch已經成爲Github上最受歡迎的專案之一,程式碼貢獻者超過300人。一家主營Elasticsearch的公司就此成立,他們一邊提供商業支援一邊開發新功能,不過Elasticsearch將永遠開源且對所有人可用。

Shay的妻子依舊等待着她的食譜搜尋……


5. ES的應用場景

ES主要以輕量級JSON作爲數據儲存格式,這點與MongoDB有點類似,但它在讀寫效能上優於 MongoDB 。同時也支援地理位置查詢 ,還方便地理位置和文字混合查詢 。 以及在統計、日誌類數據儲存和分析、視覺化這方面是引領者。

  • 國外:

Wikipedia(維基百科)使用ES提供全文搜尋並高亮關鍵字、StackOverflow(IT問答網站)結合全文搜尋與地理位置查詢、Github使用Elasticsearch檢索1300億行的程式碼。

  • 國內:

百度(在雲分析、網盟、預測、文庫、錢包、風控等業務上都應用了ES,單叢集每天匯入30TB+數據, 總共每天60TB+)、新浪 、阿裡巴巴、騰訊等公司均有對ES的使用。

使用比較廣泛的平臺ELK(ElasticSearch, Logstash, Kibana)。

6. ES中基本概念

6.1 接近實時(NRT Near Real Time )

Elasticsearch是一個接近實時的搜尋平臺。這意味着,從索引一個文件直到這個文件能夠被搜尋到有一個輕微的延遲(通常是1秒內)

6.2 索引(index)

一個索引就是一個擁有幾分相似特徵的文件的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母的)並且當我們要對這個索引中的文件進行索引、搜尋、更新和刪除的時候,都要使用到這個名字索引類似於關係型數據庫中Database 的概念。在一個叢集中,如果你想,可以定義任意多的索引。

6.3 型別(type)

在一個索引中,你可以定義一種或多種型別。一個型別是你的索引的一個邏輯上的分類/分割區,其語意完全由你來定。通常,會爲具有一組共同欄位的文件定義一個型別。比如說,我們假設你運營一個部落格平臺並且將你所有的數 據儲存到一個索引中。在這個索引中,你可以爲用戶數據定義一個型別,爲部落格數據定義另一個型別,當然,也可 以爲評論數據定義另一個型別。型別類似於關係型數據庫中Table的概念

NOTE: 在5.x版本以前可以在一個索引中定義多個型別,6.x之後版本也可以使用,但是不推薦,在7~8.x版本中徹底移除一個索引中建立多個型別

6.4 對映(Mapping)

Mapping是ES中的一個很重要的內容,它類似於傳統關係型數據中table的schema,用於定義一個索引(index)中的型別(type)的數據的結構。 在ES中,我們可以手動建立type(相當於table)和mapping(相關與schema),也可以採用預設建立方式。在預設設定下,ES可以根據插入的數據自動地建立type及其mapping。 mapping中主要包括欄位名、欄位數據型別和欄位索引型別

6.5 文件(document)

**一個文件是一個可被索引的基礎資訊單元,類似於表中的一條記錄。**比如,你可以擁有某一個員工的文件,也可以擁有某個商品的一個文件。文件以採用了輕量級的數據交換格式JSON(Javascript Object Notation)來表示。

6.6 概念關係圖

image-20200701163807755

7. ES的安裝

7.1 準備環境

# 0.安裝前準備
- centos7 +
- java 8  +
- elastic 6.8.0+

# 1.在官方網站下載ES
- wget http://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.0.tar.gz

# 2.安裝JDK(必須JDK1.8+)
- rpm -ivh jdk-8u181-linux-x64.rpm
	/*注意:預設安裝位置 /usr/java/jdk1.8.0_171-amd64*/

# 3.設定環境變數
- vim /etc/profile
	在檔案末尾加入:
	export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
	export PATH=$PATH:$JAVA_HOME/bin

# 4.過載系統設定
- source /etc/profile

image-20200630212439770

7.2 安裝ES服務

# 1. ES不能以root使用者身份啓動必須建立普通使用者
- a.在linux系統中建立新的組
		groupadd es
- b.建立新的使用者es並將es使用者放入es組中
		useradd es -g es 
- c.修改es使用者密碼
		passwd es

# 2.使用普通使用者登錄並上傳安裝包

image-20200630213055413

# 3.解壓縮elasticsearch
- tar -zxvf elasticsearch-6.8.0.tar.gz

image-20200630212630392

# 4.進入ES安裝目錄檢視目錄結構
- bin                         可執行的二進制檔案的目錄
- config                    	組態檔的目錄
- lib                         執行時依賴的庫
- logs         								執行時日誌檔案
- modules											執行時依賴的模組
- plugins                   	可以安裝官方以及第三方外掛

image-20200630212850554

# 5.進入bin目錄中啓動ES服務
- ./elasticsearch
- 出現下圖紅色日誌說明啓動成功:

image-20200630213303918

# 6.執行如下命令測試用戶端操作
- curl http://localhost:9200

image-20200630213526877

7.3 開啓遠端連線許可權

注意:ES服務預設啓動是受保護的,只允許本地用戶端連線,如果想要通過遠端用戶端存取,必須開啓遠端連線

# 1.開啓ES遠端存取
- vim elasticsearch.yml 將原來network修改爲以下設定:
	network.host: 0.0.0.0
  • 原始設定

image-20200630213816272

  • 修改後設定

image-20200630214020095

# 2.重新啓動啓動ES服務
- [es@localhost bin]$ ./elasticsearch

image-20200630214239158

# 3.重新啓動es出現如下錯誤
- ERROR: [3] bootstrap checks failed
	[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
	[2]: max number of threads [3802] for user [es] is too low, increase to at least [4096]
	[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

# 4.解決錯誤[1] 使用root使用者修改系統設定
- vim /etc/security/limits.conf	 在最後面追加下面 下麪內容
	*               soft    nofile          65536
	*               hard    nofile          65536
	*               soft    nproc           4096
	*               hard    nproc           4096

image-20200630214626888

# 5.登錄重新在檢測設定是否生效
- ulimit -Hn
	ulimit -Sn
	ulimit -Hu
	ulimit -Su

image-20200630214938946

# 6.解決錯誤[2]  使用root使用者修改系統設定
- vim /etc/security/limits.d/20-nproc.conf 
	啓動ES使用者名稱 soft nproc 4096

image-20200630215059327

image-20200630215215846

# 7.解決錯誤[3] 使用root使用者修改系統設定
- vim /etc/sysctl.conf
	vm.max_map_count=655360

image-20200630215322421

image-20200630215346079

# 8.執行如下命令檢測是否生效
- sysctl -p

image-20200630215443290

# 9.退出從新登錄之後重新啓動ES服務
- [es@localhost bin]$ ./elasticsearch

image-20200630215848212

# 10.通過瀏覽器存取ES服務
- http://192.168.102.200:9200

image-20200630220237339