一聂示、什么是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作為文檔的序列化格式
作用:提供了一個(gè)分布式多用戶的全文搜索引擎,用于云計(jì)算中趋观,能夠達(dá)到實(shí)時(shí)搜索扛禽,穩(wěn)定,可靠皱坛,快速编曼,安裝使用方便。
ES執(zhí)行過(guò)程:
- 用戶將數(shù)據(jù)提交到Elastic Search 數(shù)據(jù)庫(kù)剩辟;
- 通過(guò)分詞控制器去將對(duì)應(yīng)的語(yǔ)句分詞掐场,將其權(quán)重和分詞結(jié)果一并存入數(shù)據(jù);
- 當(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è)文檔拟赊。
為了方便理解,可以類比到關(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端口)
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/砂客。
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);
}
}
}