es的原理
1、介紹
elasticsearch 是乙個分布式可擴充套件的實時搜尋和分析引擎,乙個建立在全文搜尋引擎 apache lucene(tm) 基礎上的搜尋引擎.當然 elasticsearch 並不僅僅是 lucene 那麼簡單,它不僅包括了全文搜尋功能,還可以進行以下工作:
2、基本概念
elasticsearch是面向文件型資料庫,一條資料在這裡就是乙個文件,用json作為文件序列化的格式。
用mysql這樣的資料庫儲存就會容易想到建立一張user表,有balabala的字段等,在elasticsearch裡這就是乙個文件,當然這個文件會屬於乙個user的型別,各種各樣的型別存在於乙個索引當中。這裡有乙份簡易的將elasticsearch和關係型資料術語對照表:
關聯式資料庫 ⇒ 資料庫 ⇒ 表 ⇒ 行 ⇒ 列(columns)
elasticsearch ⇒ 索引(index) ⇒ 型別(type) ⇒ 文件(docments) ⇒ 字段(fields)
3、索引elasticsearch索引的精髓:
一切設計都是為了提高搜尋的效能傳統關係型資料庫用的索引方式是b-tree,用樹型結構儲存索引,能同時兼顧插入和查詢的效能。
為了提高查詢的效率,減少磁碟尋道次數,將多個值作為乙個陣列通過連續區間存放,一次尋道讀取多個資料,同時也降低樹的高度。
es用的是倒排索引
傳統資料庫根據索引查資料的時候,資料庫把索引排序儲存,然後磁碟根據範圍去尋找對應的資料
es是把索引和索引對應的資料id儲存起來,然後建立起索引字典樹,存到記憶體裡,根據給的索引值,在字典裡面查詢到對應的索引,獲取資料id然後再獲取資料
elasticsearch的索引思路:
將磁碟裡的東西盡量搬進記憶體,減少磁碟隨機讀取次數(同時也利用磁碟順序讀特性),結合壓縮演算法使用記憶體。講解的比較詳細的文章
es安裝
集群部署就是重複上面的步驟,除了配置檔案要改,其他都一樣
配置檔案修改
es的配置檔案在config資料夾裡,檔名叫做elasticsearch.yml,預設配置比較全面,下面主要列出幾點要關注的配置:
2、node.name: node-1 當前節點的名字,每台伺服器裡的es都要配置,最好不一樣,不配置的話,每次啟動都會隨機生成乙個名字,你就要去把節點名字和伺服器對應起來,下次啟動又會變,必須要配
3、node.attr.rack: r1 類似於資料庫裡面的唯一資料id,集群裡面的節點配置都要不一樣
4、node.master: true 當前節點有成為主節點的資格。es是對外無主節點,對內有主節點,主節點是集群裡面自動從有資格的節點裡面選舉出來的 預設配置就是true
5、node.data: true 當前節點可以儲存資料,預設配置就是true
6、path.data: /path/to/data 儲存資料檔案的路徑,這個配置到伺服器的其他資料夾,別放在es資料夾裡,不然以後重灌es的時候資料就會沒了。最好配置多個資料夾路徑,如果將每個目錄分別掛載不同的硬碟,這可是乙個簡單且高效實現乙個軟磁碟陣列( raid 0 )的辦法。elasticsearch 會自動把條帶化(注:raid 0 又稱為 stripe(條帶化),在磁碟陣列中,資料是以條帶的方式貫穿在磁碟陣列所有硬碟中的) 資料分隔到不同的目錄,以便提高效能。
7、path.logs: /path/to/logs 日誌檔案的存放路徑,配置到安裝目錄之外的資料夾
9、network.host: 192.168.0.110 配置當前節點所在的伺服器ip
10、http.port: 9200 配置當前服務所用的ip埠
11、discovery.zen.ping.unicast.hosts: ["host1", "host2"] 配置集群其他節點伺服器的ip和埠,意思就是通過這個,當前節點會告訴你配置的兩個節點伺服器,當前節點是活著的
12、discovery.zen.minimum_master_nodes: 3minimum_master_nodes
設定對你的集群的穩定 極其 重要,用於控制選舉行為發生的最小集群節點數量
13、gateway.recover_after_nodes: 8 這個設定就是用來規定,10個節點裡最少啟動8個,剩下的2個沒啟動就開始複製資料,限制了最低的節點啟動個數
14、gateway.expected_nodes: 10 這個配置就是告訴集群,這個集群的節點數總共是幾個
15、gateway.recover_after_time: 5m 這個配置就是說,如果集群啟動個數達到了最低要求,集群還會等那些沒啟動的節點5分鐘,5分鐘後還沒啟動就認為那些節點已經不能用了,就會啟動分片複製等操作了
16、action.destructive_requires_name: true 設定是否可以通過正則或者_all刪除或者關閉索引庫,預設true表示必須需要顯式指定索引庫名稱。生產環境建議設定為true,刪除索引庫的時候必須顯式指定,否則可能會誤刪索引庫中的索引庫。
17、# 安裝header外掛程式時的必要引數:
es的配置就到這裡差不多了,還有很多配置是涉及到es優化的,大家可以去網上找下。當伺服器的es集群部署好之後,剩下的就是在**中如何去使用es了。
我用的是spring boot框架,導包用的是gradle,下面就是怎麼把es整合到框架中
1、導包
compile group: 'org.elasticsearch.client', name: 'transport', version: '5.5.2'
compile group:'org.apache.logging.log4j',name:'log4j-core',version:'2.10.0'
client包是用來連線es,下面這個log4j,我查過es,他裡面帶的日誌就是log4j,但是我的專案裡面用的是slf4j,所以要重新匯入,這個時候兩種日誌會出現日誌衝突問題,可能本地還好,但是伺服器上專案就啟動不了,這就要根據各自專案進行修改
2、建立連線es的config檔案
@configuration
public class esconfig catch (exception e)
return null;}}
友情提示,埠用的是9300,
9200作為http協議,主要用於外部通訊
9300作為tcp協議,jar之間就是通過tcp協議通訊
es集群之間是通過9300進行通訊。
我這裡沒配集群,只用了乙個節點,當使用集群的時候,就要使用動態**
3、使用es進行增刪改
public void getgradelist(mmessage message) throws exception
es學習差不多就這樣了,剩下的就是實踐了
關於es6 import export的學習隨筆
記得之前的一次面試中,有個面試官問了我關於es6匯入和匯出的一些知識點,可惜當時對這方面沒在意,只知道每次機械的import和export,也不知道為啥要這樣用,現在靜下心來,好好的把這塊看了下,順便把自己的學習內容記錄下來,方便將來的時候翻閱。es6模組主要是由export和import組成。乙個...
關於es的No Node Exception異常
在使用es進行導資料時,總是是不是的發生no node exception,現在在此總結一下發生no node 的情況。如下情況極有可能發生no node exception 1 客戶端與伺服器es版本不一致。2 es伺服器ip指定錯誤或者es伺服器已停止服務。3 es伺服器端口指定錯誤。4 伺服器...
關於es6的整理和學習
1 const 定義常量 無法更改 但如果事物件可以更改內部屬性 例如 const a let a.aa 2可以更改 2 var 函式作用域 let 塊狀作用域 3 模板字串 let a i let b love console.log you 4 函式擴充套件 4.1 引數預設值 原始寫法 fun...