教程揭秘 | 動力節(jié)點內部Java零基礎教學文檔第二十二篇:Elasticsearch
接上期后續(xù)
本期分享第二十二章節(jié)
Elasticsearch
今天是最后一章了,大家學習的怎么樣了?
有認真跟更新嘛?
不會的問題解決了嗎?
今日教學文檔分享來了?

今日新篇章
【Elasticsearch】
1.?Elasticsearch簡介
Elasticsearch是一個基于Lucene的一個開源的分布式、RESTful 風格的搜索和數(shù)據(jù)分析引擎。Elasticsearch是用Java語言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎。Elasticsearch用于云計算中,能夠達到實時搜索,穩(wěn)定,可靠,快速,安裝使用方便。官方客戶端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和許多其他語言中都是可用的。根據(jù)DB-Engines的排名顯示,Elasticsearch是最受歡迎的企業(yè)搜索引擎,其次是Apache Solr,也是基于Lucene。?
2.?Lucene?核心庫(紅黑二叉樹)
Lucene 可以說是當下最先進、高性能、全功能的搜索引擎庫——無論是開源還是私有,但它也僅僅只是一個庫。為了充分發(fā)揮其功能,你需要使用 Java 并將 Lucene 直接集成到應用程序中。 更糟糕的是,您可能需要獲得信息檢索學位才能了解其工作原理,因為Lucene 非常復雜。
為了解決Lucene使用時的繁復性,于是Elasticsearch便應運而生。它使用 Java 編寫,內部采用 Lucene 做索引與搜索,但是它的目標是使全文檢索變得更簡單,簡單來說,就是對Lucene 做了一層封裝,它提供了一套簡單一致的 RESTful API 來幫助我們實現(xiàn)存儲和檢索。
?

3.?和solr對比
?




ElasticSearch 對比?Solr 總結
1.?es基本是開箱即用,非常簡單。Solr安裝略微復雜一丟丟
2.?Solr 利用 Zookeeper 進行分布式管理,而 Elasticsearch 自身帶有分布式協(xié)調管理功能。
3.?Solr 支持更多格式的數(shù)據(jù),比如JSON、XML、CSV,而 Elasticsearch 僅支持json文件格式。
4.?Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高級功能多有第三方插件提供,例如圖形化界面需要kibana,head等友好支撐,分詞插件
5.?Solr 查詢快,但更新索引時慢(即插入刪除慢),用于電商等查詢多的應用(之前);
ES建立索引快(即查詢慢),即實時性查詢快,用于推特 新浪等搜索。
Solr 是傳統(tǒng)搜索應用的有力解決方案,但 Elasticsearch 更適用于新興的實時搜索應用。
6.?Solr比較成熟,有一個更大,更成熟的用戶、開發(fā)和貢獻者社區(qū),而 Elasticsearch相對開發(fā)維護者較少,更新太快,學習使用成本較高。??(現(xiàn)在es也比較火)
4.?倒排索引(重點)
正排索引根據(jù)id 找到對應的一組數(shù)據(jù) ?(B+tree 聚簇索引)
非聚簇索引:給一個字段建立索引,查詢的時候 根據(jù)這個字段查到這行數(shù)據(jù)對應的id
回表 ?再根據(jù)id 去查 聚簇索引 從而拿到一行數(shù)據(jù)
4.1?正排索引
?

4.2?倒排索引
?

一個倒排索引由文檔中所有不重復詞的列表構成,對于其中每個詞,有一個包含它的 Term 列表。
5.?分詞
就是按照一定的規(guī)則,將一句話分成組合的單詞,按照國人喜歡來進行的
海上生明月 - 如何分成 ?----->海上 | 生 | 明月
我想要個女朋友 ---- > 我|想要|要個|女朋友|朋友
6.?模擬一個倒排索引
原理步驟:
1.?將數(shù)據(jù)存入mysql之前,對其進行分詞
2.?講分詞和存入后得到的id,存放在數(shù)據(jù)結構中Map<String,Set<Integer>> index
3.?查詢時先分詞,然后從index中拿到Set<Integer> ids
4.?再根據(jù)ids 查詢mysql,從而得到結果,這樣借助了mysql的B+tree索引,提高性能
6.1?創(chuàng)建boot項目選擇依賴
?

6.2?引入分詞的依賴
6.3?修改啟動類,注入結巴分詞器
6.4?測試分詞
6.5?使用商品搜索案例來展示倒排索引結構
6.5.1?新建Goods類
6.5.2?模擬數(shù)據(jù)庫,新建DBUtil類
6.5.3?創(chuàng)建倒排索引的數(shù)據(jù)結構
6.5.4?創(chuàng)建GoodsService接口
6.5.5?創(chuàng)建GoodsServiceImpl實現(xiàn)類
6.5.6?編寫測試類
7.?Elasticsearch安裝
下載地址 https://www.elastic.co/cn/downloads/past-releases#elasticsearch??
echo 3 > /proc/sys/vm/drop_caches
?

1.Docker拉取鏡像,我們選7.15.2版本,因為springboot的2.6.3版指定的是這個版本
docker pull elasticsearch:7.15.2
2.?運行鏡像
docker run -d --name elasticsearch --net=host -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" ?elasticsearch:7.15.2
3.?試訪問 ip:9200
?

?
1.?意外
錯誤:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144],你最少需要262144的內存
運行:sysctl -w vm.max_map_count=262144?
重啟容器就ok 了
8.?Elasticsearch目錄學習
?


?
bin:啟動腳本
config:
? elasticsearch.yml,ES的集群信息、對外端口、內存鎖定、數(shù)據(jù)目錄、跨域訪問等屬性的配置
? jvm.options,ES使用Java寫的,此文件用于設置JVM相關參數(shù),如最大堆、最小堆
log4j2.properties,ES使用log4j作為其日志框架
data:數(shù)據(jù)存放目錄(索引數(shù)據(jù))
plugins: ES的可擴展插件存放目錄,如可以將ik中文分詞插件放入此目錄,ES啟動時會自動加載
9.?Elasticsearch可視化插件的安裝
9.1?谷歌插件方式
?


?
9.2?Docker鏡像方式安裝(和9.1選擇一個玩)
?

docker run --name eshead -p 9100:9100 -d mobz/elasticsearch-head:5
9.3?解決跨域問題
?

1.進入elasticsearch容器
docker exec -it elasticsearch bash
2.進入配置文件
cd /usr/share/elasticsearch/config
2.?修改elasticsearch.yml配置文件,?
vi elasticsearch.yml
3.??結尾添加
http.cors.enabled: true
http.cors.allow-origin: "*"
4.?重啟elasticsearch后訪問即可
docker restart elasticsearch
10.?IK分詞的安裝【重點】**
Ik分詞在es 里面也是插件的形式安裝的
10.1?沒有ik分詞的時候
?

10.2?IK分詞安裝(方式一受網(wǎng)速影響)
1.?找對應的ES版本的IK分詞 ?
https://github.com/medcl/elasticsearch-analysis-ik/releases
2.?進入容器 docker exec -it elasticsearch bash
3.?進入這個目錄 /usr/share/elasticsearch/bin
4.?執(zhí)行命令 install 后面的連接就是從上面找到的對應的版本下載鏈接
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.15.2/elasticsearch-analysis-ik-7.15.2.zip
5.?下載完成
?

10.3?IK分詞安裝(方式二推薦)
1.?找對應的ES版本的IK分詞 https://github.com/medcl/elasticsearch-analysis-ik/releases?
2.?下載到windows上
3.?將zip文件拷貝到linux上
4.?docker cp linux的路徑 elasticsearch:/usr/share/elasticsearch/plugins
?

5.?進容器后解壓,注意名字unzip elasticsearch-analysis-ik-7.15.2.zip -d ./ik/
6.?刪掉zip文件 elasticsearch-analysis-ik-7.15.2.zip
10.4?重啟ES測試
docker restart elasticsearch
Ik分詞的兩種方式:
ik_smart:分詞的粒度較小,也叫智能分詞
?

ik_max_word:分詞的粒度較大,也叫最大力度分詞
?

10.5?自定義分詞【了解】
進入容器
?

11.?Elasticsearch核心概念【重點】
一個json串 叫文檔 ?es又被叫文檔性數(shù)據(jù)庫
11.1?結構說明?

11.2?索引庫(indices)
把數(shù)據(jù)寫入elasticsearch 時,會在里面建立索引,索引庫里面存儲索引,一個index 對應一個database
11.3?文檔(document)
就是一條數(shù)據(jù),一般使用json 表示,和數(shù)據(jù)庫對比,就是一行數(shù)據(jù),在java 里面就是一個一個對象
11.4?字段(field)
一個對象的屬性,對應數(shù)據(jù)庫就是一列
11.5?節(jié)點
一臺運行elasticsearch的服務器,被稱為一個節(jié)點
11.6?集群
多個節(jié)點組成一個集群
11.7?分片
一個索引可以存儲在多個主分片上,有負載均衡的作用,還有從分片是主分片的一個副本
11.8?副本
一份數(shù)據(jù)可以有多個副本,做數(shù)據(jù)冗余(安全),一般放在從分片里面
?

12.?Elasticsearch基本使用(重點)
Elasticsearch?是基于restful風格的http應用
Restful風格就是使用http動詞形式對url資源進行操作(GET,POST,PUT,DELETE...)
操作格式為:
請求類型 ip:port/索引名/_doc/文檔id
{請求體}
12.1?對索引和mappings的操作(建庫建表約束)
12.1.1?新增索引
PUT http://192.168.226.128:9200/student??新建一個student索引,給定幾個字段約束
索引只能增刪,不能修改
查詢索引信息
?

查詢索引的mappings信息
?

12.1.2?刪除索引
DELETE http://192.168.226.128:9200/student?
12.2?對Document的操作
12.2.1?新增數(shù)據(jù)(方便后面演示,自己多新增幾條)
使用put請求新增時需要自己指定id,使用post請求新增時系統(tǒng)會自動生成一個id
PUT http://192.168.226.128:9200/user/_doc/1?請求解釋
user: 索引名稱
_doc:類型(即將剔除,官方建議全部使用_doc)
1: 文檔id
?

從head插件里面查看數(shù)據(jù)
?

12.2.2?修改一個數(shù)據(jù)
1.?危險的修改,把其他的字段值都刪了
PUT http://192.168.226.128:9200/user/_doc/2?
?


?
2.?安全的修改,其他的字段值會保留
POST http://192.168.226.128:9200/user/_doc/2/_update?
?


?
12.2.3?刪除一個數(shù)據(jù)
DELETE http://192.168.226.128:9200/user/_doc/3?
?


?
12.2.4?查詢一個數(shù)據(jù)
GET http://192.168.226.128:9200/user/_doc/1?
?

12.2.5?查詢全部數(shù)據(jù)
GET http://192.168.226.128:9200/user/_doc/_search?
?
13.?SpringBoot使用ES【重點】
13.1?新建項目選擇依賴
?

13.2?修改配置文件
spring:
????elasticsearch:
????????uris: http://192.168.226.129:9200
?
13.3?測試連接ES
說明我們連接成功,下面開始操作
?

13.4?對索引的操作,我們直接使用實體類操作
13.4.1?新建Goods實體類
?
13.5?對文檔的操作,我們熟悉的CRUD
13.5.1?創(chuàng)建goodsDao
13.5.2?新增數(shù)據(jù)
13.5.3?修改數(shù)據(jù)(注意是危險修改)
13.5.4?刪除數(shù)據(jù)
?
13.5.5?根據(jù)id查詢數(shù)據(jù)
?
13.5.6?查詢所有數(shù)據(jù)
?
14.?復雜的查詢操作【重點】
14.1?查詢注意點
match:會通過分詞器去模糊匹配?例如:華為電腦,會把包含‘華為’,‘電腦’,都查出來
matchPhrase:不分詞查詢,彌補了match和term
term:精確查找你的關鍵字,一般使用keywords的約束,使用term
rang:范圍查詢
match 和 rang 如果同時出現(xiàn),需要組合bool查詢
分頁,排序是通用的查詢,不需要通過bool組合使用,直接nativeSearchQueryBuilder使用
14.2?查詢常用類
QueryBuilders:構造條件對象,例如matchQuery,rangeQuery,boolQuery等
NativeSearchQueryBuilder:組合條件對象,組合后使用build構建查詢對象
HighlightBuilder:高亮的查詢類,注意使用它的Field靜態(tài)內部類
FunctionScoreQueryBuilder:權重類,注意它的FilterFunctionBuilder靜態(tài)內部類
14.3?關鍵字,范圍,分頁,排序
14.4?高亮查詢
???
14.5?權重查詢
15.?ES集群(了解)
這里使用windows方式演示集群
Linux上的集群道理一樣,修改配置文件即可
可以參考https://my.oschina.net/u/4353003/blog/4333773
15.1?創(chuàng)建三個es節(jié)點
解壓出三個來
?

15.2?修改配置文件
15.2.1?Node1修改配置文件
進入elasticsearch-7.15.2-node1\config下,修改elasticsearch.yml
15.2.2?Node2修改配置文件
15.2.3?Node3修改配置文件
15.3?啟動es
進入bin目錄下 逐個啟動,三臺全部雙擊啟動,注意不要關閉黑窗口
15.4?訪問查看集群信息和狀態(tài)
訪問查看:http://127.0.0.1:9200/_cat/nodes?
?

也可以使用head插件查看
?

15.5?SpringBoot連接es集群
spring:
????elasticsearch:
????????uris:
????????????- http://127.0.0.1:9200
????????????- http://127.0.0.1:9201
????????????- http://127.0.0.1:9202
16.?Es總結面試
16.1?為什么使用es?(結合項目業(yè)務來說)
商城中的數(shù)據(jù),將來會非常多,所以采用以往的模糊查詢,模糊查詢前置配置,會放棄索引,(%name%)導致商品查詢是全表掃描,在百萬級別的數(shù)據(jù)庫中,效率非常低下,而我們使用ES做一個全文索引,我們將經常查詢的商品的某些字段,比如說商品名,描述、價格還有id這些字段我們放入我們索引庫里,可以提高查詢速度。??(數(shù)據(jù)量過大,而且用戶經常使用查詢的場景,對用戶體驗很好)
16.2?es用來做什么(場景)重點
1.?商品存放 (業(yè)務數(shù)據(jù)的存放) 每個商品都是一個對象
2.?日志統(tǒng)計 (整個應用的日志非常多,都要收集起來,方便后期做日志分析,數(shù)據(jù)回溯)
3.?數(shù)據(jù)分析(大數(shù)據(jù))(只要是電商,就要和tb,jd等對比價格,做數(shù)據(jù)分析等)
你做一個電商項目 你賣鞋子 衣服 ?你怎么 定價 ?鞋子 199 599 398 ?
你寫個爬蟲 定期采集tb jd的數(shù)據(jù)庫 做數(shù)據(jù)比對分析 做 競品 分析 ??
?
定期的做數(shù)據(jù)采集和分析 數(shù)據(jù)采集系統(tǒng) 定時任務去采集別的大型電商網(wǎng)站的數(shù)據(jù),進行價格分析,從而定價,后期還要做競品分析
16.3?什么是倒排索引
通常正排索引是通過id映射到對應的數(shù)據(jù)
倒排索引是將分詞建立索引,通過分詞映射到id,在通過id找到數(shù)據(jù)
詳見文檔4.2
16.4?es的存儲數(shù)據(jù)的過程
?

1:寫入請求,分發(fā)節(jié)點。
2:數(shù)據(jù)寫入同時寫入內存和translog各一份,tanslog為保證數(shù)據(jù)不丟失,每 5 秒,或每次請求操作結束前,會強制刷新 translog 日志到磁盤上
3:確定數(shù)據(jù)給那個分片,refresh 刷新內存中數(shù)據(jù)到分片的segment,默認1秒刷新一次,為了提高吞吐量可以增大60s。參數(shù)refresh_interval(refresh操作使得寫入文檔搜索可見)
4:通過flush操作將segment刷新到磁盤中完成持久化,保存成功清除translog,新版本es的 translog 不會在 segment 落盤就刪,而是會保留,默認是512MB,保留12小時。每個分片。所以分片多的話 ,要考慮 translog 會帶來的額外存儲開銷(flush操作使得filesystem cache寫入磁盤,以達到持久化的目的) (refresh之前搜索不可見)
5:segment過多會進行合并merge為大的segment,消耗大量的磁盤io和網(wǎng)絡io (方便數(shù)據(jù)整理和磁盤優(yōu)化)
16.5?es的搜索過程
1、搜索被執(zhí)行成一個兩階段過程,我們稱之為 Query?Then Fetch;
2、在初始查詢階段時,查詢會廣播到索引中每一個分片拷貝(主分片或者副本分
片)。 每個分片在本地執(zhí)行搜索并構建一個匹配文檔的大小為 from + size 的
優(yōu)先隊列。
注意:在搜索的時候是會查詢 Filesystem Cache 的,但是有部分數(shù)據(jù)還在 Memory
Buffer,所以搜索是接近實時的。
3、每個分片返回各自優(yōu)先隊列中所有文檔的 ID 和排序值給協(xié)調節(jié)點(主節(jié)點),它合并
這些值到自己的優(yōu)先隊列中來產生一個全局排序后的結果列表。
4、接下來就是 取回階段,協(xié)調節(jié)點辨別出哪些文檔需要被取回并向相關的分片
提交多個 GET 請求。每個分片加載并 豐富 文檔,如果有需要的話,接著返回
文檔給協(xié)調節(jié)點。一旦所有的文檔都被取回了,協(xié)調節(jié)點返回結果給客戶端。
通俗的將就是:
每個分片先拿到id和排序值,然后整合成一個全局列表
然后通過判斷找到相應的節(jié)點提交多個get請求,組裝數(shù)據(jù)返回
https://javajl.yuque.com/docs/share/61000afe-fc17-4bb7-9279-63bfba5fd6cc?# 《Elasticsearch 7.x(入門)》密碼:yk91

動力節(jié)點內部教學文檔已經分享結束了~
沒有下期了!
大家學會了嗎?
不會的可以下方留言~
會有大神幫您解答的!
