初識elasticsearch
什么是elasticsearch?
elasticsearch是一款非常強大的開源搜索引擎,可以幫助我們從海量數據中快速找到需要的內容。
elasticsearch結合kibana、Logstash、Beats,也就是elastic stack (ELK)。被廣泛應用在日志數據分析、實時監(jiān)控等領域
elasticsearch是elastic stack的核心,負責存儲、搜索、分析數據
elasticsearch的發(fā)展
Lucene是一個java語言的搜索引擎類庫,是Apache公司的頂級項目,由DougCutting于1999年研發(fā)官網地址: https://lucene.apache.org/
2004年shay Banon基于Lucene開發(fā)了Compass
2010年shay Banon 重寫了Compass,取名為Elasticsearch。
官網地址: https://www.elastic.co/cn/,它的優(yōu)點就是能夠被任何語言調用,發(fā)送http請求即可
正向索引和倒排索引
傳統(tǒng)數據庫(如MySQL)采用正向索引,例如給下表 (tb_goods)中的id創(chuàng)建索引
elasticsearch采用倒排索引:
文檔(document):每條數據就是一個文檔
詞條(term):文檔按照語義分成的詞語
什么是文檔和詞條?
每一條數據就是一個文檔
對文檔中的內容分詞,得到的詞語就是詞條
什么是正向索引?
基于文檔id創(chuàng)建索引。查詢詞條時必須先找到文檔,而后判斷是否包含詞條
什么是倒排索引?
對文檔內容分詞,對詞條創(chuàng)建索引,并記錄詞條所在文檔的信息。查詢時先根據詞條查詢到文檔id,而后獲取到文檔
文檔
elasticsearch是面向文檔存儲的,可以是數據庫中的一條商品數據,一個訂單信息。文檔數據會被序列化為json格式后存儲在elasticsearch中
索引(Index)
索引(index):相同類型的文檔的集合,相當于數據庫中的表
映射 (mapping):索引中文檔的字段約束信息,類似數據庫中表的結構約束
概念對比
架構
Mysql: 擅長事務類型操作,可以確保數據的安全和一致性
Elasticsearch: 擅長海量數據的搜索、分析、計算
部署單點es
1.創(chuàng)建網絡
因為我們還需要部署kibana容器,因此需要讓es和kibana容器互聯。這里先創(chuàng)建一個網絡
2.加載鏡像
這里我們采用elasticsearch的7.12.1版本的鏡像,這個鏡像體積非常大,接近1G。不建議大
家自己pull。課前資料提供了鏡像的tar包
大家將其上傳到虛擬機中,然后運行命令加載即可
同理還有kibana的tar包也需要這樣做
3.運行
運行docker命令,部署單點es
訪問本機ip+es的端口號,發(fā)現已經可以訪問,部署es容器成功
部署kibana
kibana可以給我們提供一個elasticsearch的可視化界面,便于我們學習
部署
運行docker命令,部署kibana
訪問本機ip+kibana端口
發(fā)現可以訪問kibana了,說明容器創(chuàng)建成功
可在控制臺編寫DSL語句訪問es
分詞器
es在創(chuàng)建倒排索引時需要對文檔分詞;在搜索時,需要對用戶輸入內容分詞。但默認的分詞規(guī)則對中文處理并不友好。我們在kibana的DevTools中測試
可以看到自帶的分詞器對中文的處理并不友好,都是一個字一個字的分
處理中文分詞,一般會使用IK分詞器。https://github.com/medcl/elasticsearch-analysis-ik
安裝IK分詞器,參考課前資料《安裝elasticsearch.md》
1.查看數據卷目錄
安裝插件需要知道elasticsearch的plugins目錄位置,而我們用了數據卷掛載,因此需要查看elasticsearch的數據卷目錄,通過下面命令查看
顯示結果,說明plugins目錄被掛載到了:/var/1ib/docker/volumes/es-plugins/_data這個目錄中
2.解壓縮分詞器安裝包
下面我們需要把課前資料中的ik分詞器解壓縮,重命名為ik
3.上傳到es容器的插件數據卷中
也就是/var/Tib/docker/voTumes/es-plugins/_data
4.重啟容器
5.測試
IK分詞器包含兩種模式,ik_smart:最少切分,ik_max_word:最細切分
可以看到使用ik_smart方式進行分詞后,中文詞語被成功切分,不再是一個一個字的被分開
使用ik_max_word方式分詞,則比如“程序員”被分開了,然而“程序”也是一個詞,就依然被弄成了一個詞條
比如說,網絡上流行的一些新的詞匯,比如“奧力給”我們也想將它弄成一個詞條,ik分詞器識別不出來怎么辦呢?用ik分詞器-拓展詞庫解決。
ik分詞器-拓展詞庫
要拓展ik分詞器的詞庫,只需要修改一個ik分詞器目錄中的config目錄中的IkAnalyzer.cfg.xml文件
在ext.dic文件中添加想要拓展的詞語即可,如果沒有該文件,則在該目錄下新建一個
ik分詞器-停用詞庫
要禁用某些敏感詞條,只需要修改一個ik分詞器目錄中的config目錄中的IkAnalyzer.cfg.xml文件
在stopword.dic文件中添加想要停用的詞語即可
重啟es容器
重新測試,我們可以看到我們添加的新的詞匯被ik分詞器識別,分成了獨立的詞條
分詞器的作用是什么?
創(chuàng)建倒排索引時對文檔分詞
用戶搜索時,對輸入的內容分詞
IK分詞器有幾種模式?
ik smart:智能切分,粗粒度
ik max word:最細切分,細粒度
IK分詞器如何拓展詞條?如何停用詞條?
利用config目錄的IkAnalyzer.cfg.xml文件添加拓展詞典和停用詞典
在詞典中添加拓展詞條或者停用詞條
操作索引庫
mapping屬性
mapping是對索引庫中文檔的約束,常見的mapping屬性包括
type:字段數據類型,常見的簡單類型有:
字符串:text (可分詞的文本)、keyword (精確值,例如:品牌、國家、ip地址)數值: long、integer、short、byte、double、float、布爾: boolean、日期: date、對象:object
index:是否創(chuàng)建索引,默認為true
analvzer:使用哪種分詞器
properties:該字段的子字段
創(chuàng)建索引庫
ES中通過Restful請求操作索引庫、文檔。請求內容用DSL語句來表示。創(chuàng)建索引庫和mapping的DSL語法如下
查看、刪除索引庫
查看索引庫語法
刪除索引庫的語法
修改索引庫
索引庫和mapping一旦創(chuàng)建無法修改,但是可以添加新的字段,語法如下
文檔操作
添加文檔
新增文檔的DSL語法如下
查看、刪除文檔
查看文檔語法
刪除文檔的語法
修改文檔
方式一:全量修改,會刪除舊文檔,添加新文檔
方式二:增量修改,修改指定字段值
RestClient操作索引庫
什么是RestClient?
ES官方提供了各種不同語言的客戶端,用來操作ES。這些客戶端的本質就是組裝DSL語句,通過http請求發(fā)送給ES。官方文檔地址: https://www.elastic.co/guide/en/elasticsearch/client/index.html
案例:利用JavaRestClient實現創(chuàng)建、刪除索引庫,判斷索引庫是否存在
根據課前資料提供的酒店數據創(chuàng)建索引庫,索引庫名為hotel,mapping屬性根據數據庫結構定義?;静襟E如下:
1,導入課前資料Demo
2.分析數據結構,定義mapping屬性
3.初始化avaRestClient
4.利用JavaRestClient創(chuàng)建索引庫
5.利用JavaRestClient刪除索引庫
6.利用JavaRestClient判斷索引庫是否存在
步驟1: 導入課前資料Demo
首先導入課前資料提供的數據庫數據
然后導入課前資料提供的項目
該項目已經提供好了對上述表的增刪改查等一些基本操作
步驟2: 分析數據結構
mapping要考慮的問題:
字段名、數據類型、是否參與搜索、是否分詞、如果分詞,分詞器是什么
根據數據庫中該表的字段約束,編寫這個索引庫的mapping約束
在最后創(chuàng)建一個all,可以用來將所有分詞查詢的字段添加其中
步驟3: 初始化JavaRestClient
1.引入es的RestHighLevelclient依賴
2.因為SpringBoot默認的ES版本是7.6.2,所以我們需要覆蓋默認的ES版本
3.初始化RestHighLevelClient
創(chuàng)建一個測試類,在啟動前初始化RestHighLevelClient,結束后,關閉該客戶端資源
步驟4:創(chuàng)建索引庫
創(chuàng)建索引庫代碼如下
創(chuàng)建一個常量類,在里面定義靜態(tài)變量MAPPING_TEMPLATE,也就是創(chuàng)建索引庫的DSL語句
步驟5: 刪除索引庫、判斷索引庫是否存在
刪除索引庫代碼如下
判斷索引庫是否存在
RestClient操作文檔
案例:利用JavaRestClient實現文檔的CRUD
去數據庫查詢酒店數據,導入到hotel索引庫,實現酒店數據的CRUD基本步驟如下:
1.初始化JavaRestClient
2.利用JavaRestClient新增酒店數據
3.利用avaRestClient根據id查詢酒店數據
4.利用JavaRestClient刪除酒店數據
5.利用lavaRestClient修改酒店數據
步驟1:初始化JavaRestClient
創(chuàng)建一個測試類,在啟動前初始化RestHighLevelClient,結束后,關閉該客戶端資源
步驟2: 添加酒店數據到索引庫
先查詢酒店數據,然后給這條數據創(chuàng)建倒排索引,即可完成添加
添加到es索引庫中的酒店數據,里面的坐標與數據庫中的不一致,我們需要構建一個構造器,來讓數據庫中的類轉換成要存入索引庫中的這個類
將數據庫中查詢到的酒店數據,添加到es索引庫中去的代碼如下
運行后,我們去查詢該文檔,可以查詢出結果,說明添加到索引庫成功
步驟3: 根據id查詢酒店數據
根據id查詢到的文檔數據是json,需要反序列化為java對象
根據id查詢到的文檔代碼如下
運行后,控制臺輸出結果
步驟4: 根據id修改酒店數據
修改文檔數據有兩種方式:
方式一:全量更新。再次寫入id一樣的文檔,就會刪除舊文檔,添加新文檔
方式二:局部更新。只更新部分字段,我們演示方式二
修改文檔數據代碼如下
再次調用根據id查詢酒店數據的方法,發(fā)現查詢出的數據的price和starName已經被修改
步驟5: 根據id刪除文檔數據
刪除文檔代碼如下
demo中刪除文檔代碼如下
再調用根據id查詢酒店數據的方法,發(fā)現該條文檔已經查詢不到,說明刪除成功
案例:利用JavaRestClient批量導入酒店數據到ES
需求:批量查詢酒店數據,然后批量導入索引庫中
思路:
1.利用mybatis-plus查詢酒店數據
2.將查詢到的酒店數據 (Hotel) 轉換為文檔類型數據 (HotelDoc)
3,利用JavaRestClient中的Bulk批處理,實現批量新增文檔,示例代碼如下
demo中的具體代碼如下
查詢hotel索引庫的全部內容,發(fā)現所有酒店數據信息已經被導入進來文章來源:http://www.zghlxwxcb.cn/news/detail-801649.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-801649.html
到了這里,關于微服務學習|初識elasticsearch、操作索引庫、文檔操作、RestClient操作索引庫、RestClient操作文檔的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!