最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Elasticsearch

2022-08-03 20:38 作者:星月襲空  | 我要投稿

什么是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è)試




Elasticsearch的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
三江| 五大连池市| 资溪县| 庆云县| 茂名市| 娄底市| 西峡县| 莱芜市| 广饶县| 青神县| 衡东县| 安达市| 和林格尔县| 铁力市| 平舆县| 同德县| 屏东市| 疏附县| 永宁县| 景宁| 泰顺县| 台州市| 无锡市| 盐城市| 商河县| 顺昌县| 昂仁县| 大城县| 来凤县| 新宾| 灯塔市| 株洲县| 茌平县| 桦川县| 石嘴山市| 恩施市| 安泽县| 古丈县| 丹凤县| 南雄市| 滦平县|