Elasticsearch
什么是Elasticsearch
elastic:富有彈性的
search:搜索
在IT界簡(jiǎn)稱ES,但是搜索時(shí)(百度時(shí))建議使用Elasticsearch來獲得更有效的資源
這個(gè)軟件不再是SpringCloud提供的,它也不針對(duì)微服務(wù)環(huán)境的項(xiàng)目來開發(fā)
Elasticsearch和redis\mysql一樣,不僅服務(wù)與java語言,其它語言也可以使用
Elasticsearch是java開發(fā)的軟件,所以啟動(dòng)它需要java環(huán)境變量
它的功能也類似一個(gè)數(shù)據(jù)庫(kù),能高效的從大量數(shù)據(jù)中搜索匹配指定關(guān)鍵字的內(nèi)容
這樣的軟件有一個(gè)名稱全文搜索引擎
它本質(zhì)就是一個(gè)java項(xiàng)目,使用它進(jìn)行數(shù)據(jù)的增刪改查就是訪問這個(gè)項(xiàng)目的控制器方法(url路徑)
ES也會(huì)將數(shù)據(jù)保存在硬盤上
ES的底層技術(shù):
ES使用了java的一套名為L(zhǎng)ucene的API
這個(gè)API提供了全文搜索引擎核心操作的接口,相當(dāng)于搜索引擎的核心支持,ES是在Lucene的基礎(chǔ)上進(jìn)行的完善,實(shí)現(xiàn)了開箱即用的搜索引擎軟件
市面上和ES功能類似的軟件有 :?Solr/MongoDB
為什么需要Elasticsearch
數(shù)據(jù)庫(kù)進(jìn)行模糊查詢嚴(yán)重低下
所有關(guān)系型數(shù)據(jù)庫(kù)都有這個(gè)缺點(diǎn)(mysql\mariaDB\oracle\DB2等)
在執(zhí)行類似下面模糊查詢時(shí)
測(cè)試證明一張千萬級(jí)別的數(shù)據(jù)表進(jìn)行模糊查詢需要20秒以上
當(dāng)前互聯(lián)網(wǎng)項(xiàng)目要求"三高"的需求下,這樣的效率肯定不能接受
Elasticsearch主要是為了解決數(shù)據(jù)庫(kù)模糊查詢性能低下問題的
ES進(jìn)行優(yōu)化之后,從同樣數(shù)據(jù)量的ES中查詢相同條件數(shù)據(jù),效率能夠提高100倍以上
數(shù)據(jù)庫(kù)中索引基本概念
所謂的索引(index)其實(shí)就是數(shù)據(jù)目錄
通常情況下,索引是為了提高查詢效率的
數(shù)據(jù)庫(kù)索引分兩大類
聚集索引
非聚集索引
聚集索引就是數(shù)據(jù)庫(kù)保存數(shù)據(jù)的物理順序,默認(rèn)情況下就是主鍵id,所以按id查詢數(shù)據(jù)庫(kù)中的數(shù)據(jù)效率非常高
如果想在非主鍵列上添加索引,就是非聚集索引了
例如我們?cè)跀?shù)據(jù)庫(kù)表中存在一個(gè)姓名列,我們?yōu)樾彰袆?chuàng)建索引
在創(chuàng)建索引時(shí),會(huì)根據(jù)姓名內(nèi)容來創(chuàng)建索引
例如"張三"?這個(gè)姓名,創(chuàng)建索引后查詢效率就會(huì)明顯提升
如果沒有索引,這樣的查詢就會(huì)引起效率最低的逐行搜索,就是一行一行的查這個(gè)數(shù)據(jù)的姓名是不是張三
模糊查詢時(shí)因?yàn)?#39;%鼠標(biāo)%',使用的是前模糊條件,使用索引必須明確前面的內(nèi)容是什么,前模糊查詢是不能使用索引的,只能是全表的逐行搜索,所以效率非常低
Elasticsearch運(yùn)行原理
ES軟件在保存數(shù)據(jù)時(shí),和關(guān)系型數(shù)據(jù)庫(kù)不同
在將數(shù)據(jù)保存到ES時(shí),可以對(duì)指定的列進(jìn)行分詞索引保存在索引庫(kù)中
形成倒排索引結(jié)構(gòu)

Elasticsearch的啟動(dòng)
官方下載鏈接
https://www.elastic.co/cn/downloads/past-releases#elasticsearch
我們使用7.6.2的版本
壓縮包280M左右,復(fù)制到?jīng)]有中文,沒有空格的目錄下解壓
雙擊bin\elasticsearch.bat運(yùn)行
雙擊之后可能會(huì)看到下面的dos界面

這個(gè)界面不能關(guān)閉,一旦關(guān)閉ES就停止了
驗(yàn)證ES的運(yùn)行狀態(tài)
瀏覽器輸入地址:localhost:9200看到如下內(nèi)容即可

mac系統(tǒng)啟動(dòng)
linux:
ES基本使用
ES啟動(dòng)完成后,我們要學(xué)習(xí)如何操作它
我們已經(jīng)講過,操作ES是對(duì)es發(fā)送請(qǐng)求
我們創(chuàng)建一個(gè)子項(xiàng)目search,在這個(gè)子項(xiàng)目中創(chuàng)建一個(gè)專門發(fā)送各種類型請(qǐng)求的文件來操作ES
創(chuàng)建search項(xiàng)目也要父子相認(rèn)
然后子項(xiàng)目pom文件如下
下面創(chuàng)建一個(gè)能夠向ES發(fā)送請(qǐng)求的文件
這種能夠向指定url發(fā)送請(qǐng)求的文件格式稱之為http client(http?客戶端)

文件類型叫HTTP Request文件
我們先從最簡(jiǎn)單的請(qǐng)求開始
向es發(fā)送指令
analyze:分析
analyzer:分析者(分詞器)
standard是ES默認(rèn)的分詞器,"analyzer": "standard"是可以省略的
standard這個(gè)分詞器只能對(duì)英文等西文字符(有空格的),進(jìn)行正確分詞
但是中文分詞不能按空格分,按這個(gè)分詞器分詞,每個(gè)字都會(huì)形成分詞,這樣的結(jié)果不能滿足我們?nèi)粘5乃阉餍枰?/p>
我們解決中文不能正確分詞的問題
實(shí)際上要引入一個(gè)中文常見詞語的詞庫(kù),分詞時(shí)按照詞庫(kù)中的詞語分詞即可
我們可以使用免費(fèi)的中文分詞器詞庫(kù)插件IK來實(shí)現(xiàn)中文分詞效果

安裝插件之后要重啟ES才能生效
關(guān)閉Es窗口之后再雙擊運(yùn)行即可
ES啟動(dòng)之后,將中文分詞器插件設(shè)置完成,在運(yùn)行分詞
再次運(yùn)行分詞測(cè)試,應(yīng)該看到正常的中文分詞效果
ik分詞插件的使用
我們安裝的ik實(shí)際上不只一個(gè)分詞器
實(shí)際上除了ik_smart之外還有ik_max_word
上面的兩個(gè)分詞器運(yùn)行分詞,結(jié)果會(huì)有非常明顯的區(qū)別
總結(jié)區(qū)別如下
ik_smart
優(yōu)點(diǎn):特征是粗略快速的將文字進(jìn)行分詞,占用空間小,查詢速度快
缺點(diǎn):分詞的顆粒度大,可能跳過一些重要分詞,導(dǎo)致查詢結(jié)果不全面,查全率低
ik_max_word
優(yōu)點(diǎn):特征是詳細(xì)的文字片段進(jìn)行分詞,查詢時(shí)查全率高,不容易遺漏數(shù)據(jù)
缺點(diǎn):因?yàn)榉衷~太過詳細(xì),導(dǎo)致有一些無用分詞,占用空間較大,查詢速度慢
使用ES操作數(shù)據(jù)
ES是一個(gè)數(shù)據(jù)庫(kù)性質(zhì)的軟件
可以執(zhí)行增刪改查操作
我們先了解一下ES保存數(shù)據(jù)的結(jié)構(gòu)

ES啟動(dòng)后,ES服務(wù)可以創(chuàng)建多個(gè)index(索引),index可以理解為數(shù)據(jù)庫(kù)中表的概念
一個(gè)index可以創(chuàng)建多個(gè)保存數(shù)據(jù)的document(文檔),一個(gè)document理解為數(shù)據(jù)庫(kù)中的一行數(shù)據(jù)
一個(gè)document中可以保存多個(gè)屬性和屬性值,對(duì)應(yīng)數(shù)據(jù)庫(kù)中的字段(列)和字段值
項(xiàng)目node文件夾下共享了ES文檔,命令都在里面,可以測(cè)試
Redis和memcache都是緩存軟件
SpringBoot 操作 Elasticsearch
原生狀態(tài)下,我們使用JDBC連接數(shù)據(jù)庫(kù),因?yàn)榇a過于繁瑣,所以改為使用Mybatis框架
在ES的原生狀態(tài)下,我們java代碼需要使用socket訪問ES,但是也是過于繁瑣,我們可以使用SpringData框架簡(jiǎn)化
Spring Data是Spring提供的一套連接各種第三方數(shù)據(jù)源的框架集
我們需要使用的是其中連接ES的Spring Data Elasticseatrch
官方網(wǎng)站:https://spring.io/projects/spring-data
官網(wǎng)中列出了SpringData支持連接操作的數(shù)據(jù)源列表
下面我們就按照SpringDataElasticsearch的步驟對(duì)ES進(jìn)行操作
添加依賴和配置
search模塊的pom文件添加依賴
application.properties添加配置
創(chuàng)建和ES關(guān)聯(lián)的實(shí)體類
和數(shù)據(jù)庫(kù)一樣
我們操作ES時(shí)也需要一個(gè)類似實(shí)體類的數(shù)據(jù)類,作為操作ES的數(shù)據(jù)載體
search項(xiàng)目創(chuàng)建entity包
在包中創(chuàng)建Item(商品)類
創(chuàng)建操作ES的持久層
我們使用SpringData連接ES
需要使用SpringData框架對(duì)持久層的命名規(guī)則
持久層規(guī)范名稱為repository(倉(cāng)庫(kù)),創(chuàng)建這個(gè)包,包中創(chuàng)建接口ItemRepository
測(cè)試ES
創(chuàng)建測(cè)試類
編寫測(cè)試
SpringData自定義查詢
SpringData框架提供的基本增刪改查方法并不能完全滿足我們的業(yè)務(wù)需要
如果是針對(duì)當(dāng)前Es數(shù)據(jù),進(jìn)行個(gè)性化的自定義查詢,那還是需要自己編寫查詢代碼
就像我們要實(shí)現(xiàn)根據(jù)關(guān)鍵詞查詢商品信息一樣,完成類似數(shù)據(jù)庫(kù)中的模糊查詢
單條件查詢
我們查詢需求為輸出所有數(shù)據(jù)中title屬性包含"游戲"這個(gè)分詞的商品信息
參考數(shù)據(jù)庫(kù)中模糊查詢
我們使用SpringDataES進(jìn)行查詢,本質(zhì)上還是相當(dāng)于ES文檔中執(zhí)行的查詢語句
在SpringData框架下,ItemRepository接口中實(shí)現(xiàn)更加簡(jiǎn)單
下面可以開始在測(cè)試類中進(jìn)行測(cè)試查詢
上面代碼運(yùn)行時(shí)底層運(yùn)行的查詢語句為:
多條件查詢
在相對(duì)復(fù)雜的查詢邏輯下
經(jīng)常使用多個(gè)條件來定位查詢需要的數(shù)據(jù)
這樣就需要邏輯運(yùn)算符"and"/"or"
ItemRepository接口中添加多條件的查詢方法
測(cè)試代碼如下
底層運(yùn)行的請(qǐng)求
當(dāng)查詢條件關(guān)系為And時(shí),查詢語句關(guān)鍵字為must
當(dāng)查詢條件關(guān)系為Or時(shí),查詢語句關(guān)鍵字為should
排序查詢
在ItemRepository接口添加具備排序功能的查詢方法
測(cè)試
底層運(yùn)行的代碼
分頁查詢
SpringData框架支持完成分頁查詢
需要在ItemRepository接口中修改方法的參數(shù)和返回值就可以實(shí)現(xiàn)
測(cè)試