全站搜索引擎:ElasticSearch整合到SpringBoot

一聂示、什么是Elastic Search

1.ElasticSearch的定義

ElasticSearch(簡(jiǎn)稱:ES)是一個(gè)基于Lucene的分布式、高擴(kuò)展簇秒、高實(shí)時(shí)的搜索與數(shù)據(jù)分析引擎鱼喉。
特性:

  • 面向文檔的(存儲(chǔ)整個(gè)對(duì)象或文檔)
  • 底層基于Lucene封裝
  • 采用多shard分片的方式保證數(shù)據(jù)安全
  • 提供RESTful API
  • 使用JSON作為文檔的序列化格式

ElasticSearch官網(wǎng)

作用:提供了一個(gè)分布式多用戶的全文搜索引擎,用于云計(jì)算中趋观,能夠達(dá)到實(shí)時(shí)搜索扛禽,穩(wěn)定,可靠皱坛,快速编曼,安裝使用方便。

ES執(zhí)行過(guò)程:

  1. 用戶將數(shù)據(jù)提交到Elastic Search 數(shù)據(jù)庫(kù)剩辟;
  2. 通過(guò)分詞控制器去將對(duì)應(yīng)的語(yǔ)句分詞掐场,將其權(quán)重和分詞結(jié)果一并存入數(shù)據(jù);
  3. 當(dāng)用戶搜索數(shù)據(jù)時(shí)候贩猎,再根據(jù)權(quán)重將結(jié)果排名熊户,打分,再將返回結(jié)果呈現(xiàn)給用戶吭服。

ES的數(shù)據(jù)存儲(chǔ):

Elastic Search要實(shí)現(xiàn)快速檢索嚷堡,首先必須要把數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)起來(lái)。那再Elastic Search中是如何存儲(chǔ)數(shù)據(jù)的呢艇棕?
Elastic Search通過(guò)索引來(lái)進(jìn)行存儲(chǔ)數(shù)據(jù)蝌戒,一個(gè)索引中可以有若干個(gè)不同的類型串塑,每種類型都由若干條字段組成,每次存儲(chǔ)實(shí)際上都是存儲(chǔ)一種類型的實(shí)例瓶颠,叫做一個(gè)文檔拟赊。


es架構(gòu)圖.jpg

為了方便理解,可以類比到關(guān)系型數(shù)據(jù)庫(kù)中的概念進(jìn)行對(duì)比粹淋,如下表:

關(guān)系型數(shù)據(jù)庫(kù) Elasticsearch
Databases(數(shù)據(jù)庫(kù)) Indices(索引)
Tables(表) Types(類型)
Rows(行) Documents(文檔)
Columns(列) Fields(字段)

Elasticsearch包含多個(gè)索引(indices)(數(shù)據(jù)庫(kù))吸祟,每個(gè)索引可以包含多個(gè)類型(types)(表),每個(gè)類型包含多個(gè)文檔(documents)(行)桃移,每個(gè)文檔包含多個(gè)字段(Fields)(列)屋匕。

例如:若我們開發(fā)一個(gè)文件檢索系統(tǒng),當(dāng)要添加一篇文章時(shí)借杰,指定Indices為畢業(yè)論文过吻,Type為_doc,F(xiàn)ields包括:標(biāo)題蔗衡、簡(jiǎn)介纤虽、摘要、論文主體绞惦、參考文獻(xiàn)等逼纸,Document的id為1。

相關(guān)概念:

cluster:代表一個(gè)集群济蝉,集群中有多個(gè)節(jié)點(diǎn)杰刽,其中有一個(gè)為主節(jié)點(diǎn),這個(gè)主節(jié)點(diǎn)是可以通過(guò)選舉產(chǎn)生的王滤,主從節(jié)點(diǎn)是對(duì)于集群內(nèi)部來(lái)說(shuō)的贺嫂。es的一個(gè)概念就是去中心化,字面上理解就是無(wú)中心節(jié)點(diǎn)雁乡,這是對(duì)于集群外部來(lái)說(shuō)的第喳,因?yàn)閺耐獠縼?lái)看es集群,在邏輯上是個(gè)整體蔗怠,你與任何一個(gè)節(jié)點(diǎn)的通信和與整個(gè)es集群通信是等價(jià)的墩弯。

shards:代表索引分片,es可以把一個(gè)完整的索引分成多個(gè)分片寞射,這樣的好處是可以把一個(gè)大的索引拆分成多個(gè),分布到不同的節(jié)點(diǎn)上锌钮。構(gòu)成分布式搜索桥温。分片的數(shù)量只能在索引創(chuàng)建前指定,并且索引創(chuàng)建后不能更改梁丘。

replicas:代表索引副本侵浸,es可以設(shè)置多個(gè)索引的副本旺韭,副本的作用一是提高系統(tǒng)的容錯(cuò)性,當(dāng)某個(gè)節(jié)點(diǎn)某個(gè)分片損壞或丟失時(shí)可以從副本中恢復(fù)掏觉。二是提高es的查詢效率区端,es會(huì)自動(dòng)對(duì)搜索請(qǐng)求進(jìn)行負(fù)載均衡。

recovery:代表數(shù)據(jù)恢復(fù)或叫數(shù)據(jù)重新分布澳腹,es在有節(jié)點(diǎn)加入或退出時(shí)會(huì)根據(jù)機(jī)器的負(fù)載對(duì)索引分片進(jìn)行重新分配织盼,掛掉的節(jié)點(diǎn)重新啟動(dòng)時(shí)也會(huì)進(jìn)行數(shù)據(jù)恢復(fù)。

river:代表es的一個(gè)數(shù)據(jù)源酱塔,也是其它存儲(chǔ)方式(如:數(shù)據(jù)庫(kù))同步數(shù)據(jù)到es的一個(gè)方法沥邻。它是以插件方式存在的一個(gè)es服務(wù),通過(guò)讀取river中的數(shù)據(jù)并把它索引到es中羊娃,官方的river有couchDB的唐全,RabbitMQ的,Twitter的蕊玷,Wikipedia的邮利。

gateway:代表es索引快照的存儲(chǔ)方式,es默認(rèn)是先把索引存放到內(nèi)存中垃帅,當(dāng)內(nèi)存滿了時(shí)再持久化到本地硬盤延届。gateway對(duì)索引快照進(jìn)行存儲(chǔ),當(dāng)這個(gè)es集群關(guān)閉再重新啟動(dòng)時(shí)就會(huì)從gateway中讀取索引備份數(shù)據(jù)挺智。es支持多種類型的gateway祷愉,有本地文件系統(tǒng)(默認(rèn)),分布式文件系統(tǒng)赦颇,Hadoop的HDFS和amazon的s3云存儲(chǔ)服務(wù)二鳄。

discovery.zen:代表es的自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)機(jī)制,es是一個(gè)基于p2p的系統(tǒng)媒怯,它先通過(guò)廣播尋找存在的節(jié)點(diǎn)订讼,再通過(guò)多播協(xié)議來(lái)進(jìn)行節(jié)點(diǎn)之間的通信,同時(shí)也支持點(diǎn)對(duì)點(diǎn)的交互扇苞。

Transport:代表es內(nèi)部節(jié)點(diǎn)或集群與客戶端的交互方式欺殿,默認(rèn)內(nèi)部是使用tcp協(xié)議進(jìn)行交互,同時(shí)它支持http協(xié)議(json格式)鳖敷、thrift脖苏、servlet、memcached定踱、zeroMQ等的傳輸協(xié)議(通過(guò)插件方式集成)棍潘。

資源匯總:

ElasticSearch官網(wǎng)下載地址
spring-data-elasticsearch開源項(xiàng)目
ElasticSearch官方文檔

二、Elasitc Search安裝與運(yùn)行

1.JDK安裝與環(huán)境變量配置

(略)

2.Windows下載并運(yùn)行Elasitc Search

若使用Spring Data Elasticsearch的方式調(diào)用ElasticSearch,則需要注意把版本對(duì)應(yīng)好亦歉,如下:

Spring Data Elasticsearch ElasticSearch
3.2.x 6.5.0
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

下載Elasticsearch:由于我的電腦上JDK使用的是1.8恤浪,所以我下載使用ElasticSearch 6.5.0的版本。下載地址:ElasticSearch 6.5.0下載
運(yùn)行Elasticsearch:雙擊運(yùn)行elasticsearch-2.4.4\bin 目錄下的elasticsearch.bat文件肴楷。
訪問(wèn)Elasticsearch:瀏覽器訪問(wèn) http://localhost:9200水由。(默認(rèn)使用9200端口)

Elasticsearch運(yùn)行成功

3.安裝head插件

為便于管理Elasticsearch,安裝head插件可實(shí)現(xiàn)可視化管理赛蔫。
安裝head插件:打開cmd命令行:

> cd C:\elasticsearch-2.4.4\bin
> plugin install mobz/elasticsearch-head

訪問(wèn)head插件:瀏覽器中訪問(wèn)http://localhost:9200/_plugin/head/砂客。

head插件可視化管理Elasticsearch

4.把Elasticsearch安裝成Windows服務(wù)

以上已經(jīng)把本地的Elasticsearch運(yùn)行起來(lái)了,但生產(chǎn)環(huán)境每次都這樣啟動(dòng)濒募,未免過(guò)于麻煩且不安全鞭盟。最好的方式是把Elasticsearch加入到Windows服務(wù)中(Service),每次開機(jī)自動(dòng)后臺(tái)啟動(dòng)瑰剃。
打開cmd命令行:

> cd C:\elasticsearch-2.4.4\bin
> service.bat install
> service.bat start

5.使用RESTful API 向ElasticSearch中進(jìn)行HTTP訪問(wèn)

使用POSTman軟件模擬發(fā)送HTTP請(qǐng)求到ElasticSearch服務(wù)器

例如:

操作 示例請(qǐng)求 備足
添加1號(hào)文檔 POST : http://localhost:9200/索引/類型/1 body中寫入JSON對(duì)象
修改1號(hào)文檔 PUT : http://localhost:9200/索引/類型/1 body中寫入JSON對(duì)象
查詢1號(hào)文檔 GET : http://localhost:9200/索引/類型/1 body中返回JSON對(duì)象
刪除1號(hào)文檔 DELETE : http://localhost:9200/索引/類型/1 body中返回操作結(jié)果
檢查是否存在1號(hào)文檔 HEAD : http://localhost:9200/索引/類型/1 若存在則返回200狀態(tài)齿诉,否則返回404狀態(tài)
查詢所有文檔 GET : http://localhost:9200/索引/類型/_search body中的hits返回JSON對(duì)象集合
條件過(guò)濾查找 GET : http://localhost:9200/索引/類型/_search?q=字段:關(guān)鍵字 body中的hits返回JSON對(duì)象集合
表達(dá)式過(guò)濾查找 POST : http://localhost:9200/索引/類型/_search body中添加查詢表達(dá)式

三、SpringBoot整合ElasticSearch

SpringBoot默認(rèn)支持兩種形式整合ElasticSearch晌姚。

1.Jest(默認(rèn)不生效)

   使用標(biāo)準(zhǔn)的HTTP請(qǐng)求方式進(jìn)行交互(略)
   需要手工導(dǎo)入Jest的工具包(io.searchbox.client.JestClient)

2.Spring Data ElasticSearch

SpirngBoot自動(dòng)完成了以下配置:

  • 完成Client節(jié)點(diǎn)信息clusterNodes:clusterName:用于連接ES節(jié)點(diǎn)粤剧;
  • 完成ElasticsearchTemplate:用于對(duì)ES進(jìn)行數(shù)據(jù)映射;
  • 編寫了一個(gè)ElasticsearchRepository的子接口挥唠,用于操作ES的CRUD抵恋;

1.pom.xml中引入Spring-Data-ElasticSearch的依賴

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.0.RELEASE</version>
        </dependency>

注意:如果Spring-Data-ElasticSearch與ElasticSearch版本不一致,會(huì)出現(xiàn)ConnectTransportException異常宝磨,使得SpringBoot無(wú)法啟動(dòng)弧关。
此時(shí)需要修改Spring-Data-ElasticSearch版本,或修改服務(wù)器中ElasticSearch的版本唤锉。

Spring Data Elasticsearch ElasticSearch
3.2.x 6.5.0
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

2.配置Spring-Data-ElasticSearch

spring.data.elasticsearch.repositories.enabled = true
#配置ElasticSearch節(jié)點(diǎn)名稱
spring.data.elasticsearch.cluster-name=elasticsearch
#配置ElasticSearch節(jié)點(diǎn)地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
#注: 9300 是 Java 客戶端的端口世囊。9200 是支持 Restful HTTP 的接口。

配置完成后窿祥,運(yùn)行SpringBoot株憾;若運(yùn)行成功,則表示ElasticSearch整合成功晒衩!

3.添加綁定的實(shí)體類

實(shí)體類:文章

package com.zhbit.es.bean

@Document(indexName = "zhbit", type = "article")
public class Article implements Serializable{
    private Integer id;
    private String auther;
    private String title;
    private String content;
    ……
}

4.DAO層繼承ElasticsearchRepository

package com.zhbit.es.dao
import com.zhbit.es.bean.Article;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface ArticleDao extends ElasticsearchRepository<Article, Integer>{
    public List<Article> findByTitleLike(String title);
}

更多參考

5.編寫測(cè)試方法嗤瞎,測(cè)試上面的ES訪問(wèn)操作

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootElasticApplicationTests{
    @Autowired
    ArticleDao articleDao;
    @Test
    public void testArticleDao(){
        Article a1 = new Article(1,"肖sir","論智慧城市","智慧城市是現(xiàn)代化發(fā)展的必然副產(chǎn)品。");
        articleDao.index(a1);
    }
    @Test
    public void testArticleDao2(){
        for(Article a1 : articleDao.findByTitleLike("智慧"))
        {
            System.out.println(a1);
        }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末听系,一起剝皮案震驚了整個(gè)濱河市贝奇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌靠胜,老刑警劉巖弃秆,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件届惋,死亡現(xiàn)場(chǎng)離奇詭異髓帽,居然都是意外死亡菠赚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門郑藏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衡查,“玉大人,你說(shuō)我怎么就攤上這事必盖“枭” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵歌粥,是天一觀的道長(zhǎng)塌忽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)失驶,這世上最難降的妖魔是什么土居? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮嬉探,結(jié)果婚禮上擦耀,老公的妹妹穿的比我還像新娘。我一直安慰自己涩堤,他們只是感情好眷蜓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胎围,像睡著了一般吁系。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上白魂,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天汽纤,我揣著相機(jī)與錄音,去河邊找鬼碧聪。 笑死冒版,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逞姿。 我是一名探鬼主播辞嗡,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼滞造!你這毒婦竟也來(lái)了续室?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谒养,失蹤者是張志新(化名)和其女友劉穎挺狰,沒(méi)想到半個(gè)月后明郭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丰泊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年薯定,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞳购。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡话侄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出学赛,到底是詐尸還是另有隱情年堆,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布盏浇,位于F島的核電站变丧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绢掰。R本人自食惡果不足惜痒蓬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望曼月。 院中可真熱鬧谊却,春花似錦、人聲如沸哑芹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)聪姿。三九已至碴萧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間末购,已是汗流浹背破喻。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盟榴,地道東北人曹质。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像擎场,于是被迫代替她去往敵國(guó)和親羽德。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容