本文主要介紹spring boot integrated elastic search 7(spring boot integrated elastic search 6 . 5 . 4),下面一起看看spring boot integrated elastic search 7(spring boot integrated elastic search 6 . 5 . 4)相關(guān)資訊。
首先,概述一下什么是elasticsearch?
elasticsearch,簡(jiǎn)稱es,是一個(gè)開源的、高度可擴(kuò)展的分布式全文搜索引擎。
它可以近乎實(shí)時(shí)地存儲(chǔ)和檢索數(shù)據(jù);它的擴(kuò)展性非常好,可以擴(kuò)展到上百臺(tái)服務(wù)器處理pb級(jí)數(shù)據(jù)。
es也是用java開發(fā)的,以lucene為核心實(shí)現(xiàn)所有的索引和搜索功能,但其目的是通過一個(gè)簡(jiǎn)單的restful api隱藏lucene的復(fù)雜性,從而使全文搜索變得簡(jiǎn)單。
知道了es是什么之后,es的核心概念就需要知道es是如何存儲(chǔ)數(shù)據(jù)的,數(shù)據(jù)結(jié)構(gòu)是什么,如何實(shí)現(xiàn)搜索。
在學(xué)習(xí)這些之前,你需要了解elasticsearch的一些相關(guān)概念。
elasticsearch是一個(gè)面向文檔的數(shù)據(jù)庫。
相信學(xué)過mysql的同學(xué)都知道m(xù)ysql是關(guān)系數(shù)據(jù)庫,那么es和關(guān)系數(shù)據(jù)庫有什么區(qū)別呢?
讓 讓我們做一個(gè)簡(jiǎn)單的比較:
關(guān)系數(shù)據(jù)庫(mysql、oracle等。)elasticsearch數(shù)據(jù)庫(數(shù)據(jù)庫)索引(表)類型(行)文檔(列)字段:elasticsearch(集群)可以包含多個(gè)索引(數(shù)據(jù)庫)。,每個(gè)索引可以包含多個(gè)類型(表),每個(gè)類型包含多個(gè)文檔(行),每個(gè)文檔包含多個(gè)字段(列)。
物理設(shè)計(jì):
elasticsearch在后臺(tái)將每個(gè)索引分成多個(gè)切片,每個(gè)切片可以在集群中的不同服務(wù)器之間遷移。
邏輯設(shè)計(jì):
一個(gè)索引類型包含多個(gè)文檔,如文檔1、文檔2和文檔3。
當(dāng)我們索引一個(gè)文檔時(shí),我們可以通過這樣的順序找到它的:索引類型文檔id,并且我們可以通過這種組合索引一個(gè)特定的文檔。注意:id不 不必是整數(shù),但它實(shí)際上是一個(gè)字符串。
指數(shù)
索引是映射類型的容器,而elasticsearch中的索引是非常大的文檔集合。索引存儲(chǔ)映射類型的字段和其他設(shè)置。然后它們被存儲(chǔ)在每個(gè)片上。讓 讓我們研究切片是如何工作的。
物理設(shè)計(jì):節(jié)點(diǎn)和片段如何工作
一個(gè)集群至少有一個(gè)節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)就是一個(gè)elasricsearch。默認(rèn)情況下,一個(gè)節(jié)點(diǎn)可以有多個(gè)索引。如果您創(chuàng)建一個(gè)索引,該索引將由五個(gè)主碎片組成,并且每個(gè)主碎片都有一個(gè)副本。
上圖是一個(gè)有三個(gè)節(jié)點(diǎn)的集群??梢钥闯?,主碎片和對(duì)應(yīng)的副本碎片都不會(huì)在同一個(gè)節(jié)點(diǎn),有利于節(jié)點(diǎn)死亡和數(shù)據(jù)丟失。事實(shí)上,片段是一個(gè)lucene索引,一個(gè)包含倒排索引的文件目錄。倒排索引的結(jié)構(gòu)使elasticsearch能夠告訴您哪些文檔包含特定的關(guān)鍵字,而無需掃描所有文檔。其中,什么是倒排索引?
倒排索引
elasticsearch使用了一種叫做倒排索引的結(jié)構(gòu),底層是luc:中。
$ term doc _ 1 doc _ 2 study√xtoxxeevery√永遠(yuǎn)√87
$ term doc _ 1 doc _ 2 to√×for:。
如果要搜索帶python標(biāo)簽的文章,查找倒排索引數(shù)據(jù)會(huì)比查找所有原始數(shù)據(jù)快很多。只需查看標(biāo)簽列并獲得相關(guān)的文章id。
彈性搜索指數(shù)與lucene指數(shù)的比較
在elasticsearch中,索引這個(gè)詞的使用頻率很高,它是術(shù)語的使用。。在elasticsearch中,索引分為多個(gè)段,每個(gè)段都是lucene的一個(gè)索引。所以一個(gè)elasticsearch索引是由幾個(gè)lucene索引組成的。
類型
類型是文檔的邏輯容器,就像關(guān)系數(shù)據(jù)庫一樣,表是行的容器。類型中字段的定義叫做映射,比如名稱映射到字符串類型。
我們說文檔是無模式的,它們不。;不需要在地圖中定義所有的字段,比如添加一個(gè)新字段,那么elasticsearch是如何做到的呢?elasticsearch會(huì)自動(dòng)將新字段添加到地圖中,但如果字段不確定是什么類型,elasticsearch就會(huì)開始猜測(cè)。如果值是18,elasticsearch會(huì)認(rèn)為是塑料。但是elasticsearch可能是錯(cuò)誤的,所以最保險(xiǎn)的方法是提前定義需要的映射,這和關(guān)系數(shù)據(jù)庫是一樣的。首先定義字段,然后使用它們。
文件
elasticsearch是面向文檔的,這意味著索引和搜索數(shù)據(jù)的最小單位是文檔。
在彈性搜索中,文檔有幾個(gè)重要的屬性,:。
自帶,一個(gè)文檔既包含字段又包含對(duì)應(yīng)的值,也就是說還包含k:value!它可以是分層的,一個(gè)文檔包含一個(gè)自文檔,并且 邏輯實(shí)體是如何復(fù)雜的!靈活的結(jié)構(gòu),文件不 不依賴于預(yù)定義的模式。我們知道,在關(guān)系數(shù)據(jù)庫中,字段只有在預(yù)先定義的情況下才能使用。在彈性搜索中,字段非常靈活。有時(shí)候,我們可以忽略這個(gè)字段,或者動(dòng)態(tài)添加一個(gè)新字段。雖然我們可以隨意添加或忽略一個(gè)字段,但是每個(gè)字段的類型都很重要,比如一個(gè)年齡字段類型,可以是字符串,也可以是塑料。因?yàn)閑lasticsearch會(huì)保存字段和類型之間的映射以及其他設(shè)置。這種映射特定于每種映射的每種類型,這就是為什么在elasticsearch中,類型有時(shí)被稱為映射類型。
二、-analysis-ik/(版本要對(duì)應(yīng))
2.下載后解壓并將目錄復(fù)制到elasticsearch根目錄下的plugins目錄。
3.重新啟動(dòng)elasticsearch服務(wù)。在啟動(dòng)過程中,您可以看到提示消息 分析-ik 正在加載插件。服務(wù)啟動(dòng)后,在命令行上運(yùn)行elasticsearch-plugin list命令,確認(rèn)ik插件安裝成功。
ik提供了ik_smart和ik_max_word兩種分詞算法,其中ik_smart是最少切分,ik_max_word是最細(xì)粒度切分!
ik_max_word:細(xì)粒度的分詞會(huì)窮盡一個(gè)句子中所有的分詞可能性。ik_smart:粗粒度分詞,優(yōu)先匹配最長的詞,只有一個(gè)詞!例如,如果一些單詞不存在于默認(rèn)詞庫中,我們需要 我熱愛學(xué)習(xí)要被識(shí)別為一個(gè)單詞,那么我們需要編輯自定義詞庫。
步驟:
(1)進(jìn)入彈性搜索/插件/ik/config目錄。
(2)創(chuàng)建一個(gè)新的my.dic文件并編輯內(nèi)容:
我愛學(xué)習(xí)(3)修改ikanalyzer.cfg.xml(在ik/config目錄下)。
propertiescommentik分析器擴(kuò)展配置/注釋!-用戶可以在這里配置自己的擴(kuò)展字典ext _ dict my.dic/entry!-用戶可以在這里配置他們自己的擴(kuò)展停用詞詞典ext _ stopwords /entry/properties注意:修改配置后,需要重啟elasticsearch。
添加、刪除和檢查基本命令rest樣式描述
軟件架構(gòu)風(fēng)格,而不是標(biāo)準(zhǔn),只提供了一套設(shè)計(jì)原則和約束。它主要用于客戶端和服務(wù)器之間的交互軟件?;谶@種風(fēng)格設(shè)計(jì)的軟件可以更簡(jiǎn)潔,層次更分明,更容易實(shí)現(xiàn)緩存等機(jī)制。
基本rest命令描述(添加、刪除、修改和搜索命令):
methodur地址描述putlocalhost:9200/索引名/類型名/文檔id創(chuàng)建文檔(指定文檔id)post localhost:9200/索引名/類型名創(chuàng)建文檔(隨機(jī)文檔id)post localhost:9200/索引名/類型名/文檔id/_update修改文檔。delete localhost:9200//搜索名稱/類型名稱/文檔id刪除文檔get localhost:9200/索引名稱/類型名稱/文檔id查詢文檔并通過文檔idpostloclhost:9200/索引名稱/類型名稱/_search iii查詢所有數(shù)據(jù)。springboot integration es1。創(chuàng)建一個(gè)新項(xiàng)目,并創(chuàng)建一個(gè)spring boot(版本2.2.5)項(xiàng)目彈性搜索。
2.配置相關(guān)性配置彈性搜索的相關(guān)性:
properties java . version 1.8/java . version!-這里springboot默認(rèn)配置的版本不匹配,需要我們自己配置版本!-elastic search . version 7 . 6 . 1/elastic search . version/propertiesdependencygroupidorg . spring framework . boot/groupid artifactid spring-boot-starter-data-elastic search/artifact id/dependency 3。編寫elasticsearch的配置類,提供bean resthighlevelclient進(jìn)行操作。
包c(diǎn)om . hzx . config;導(dǎo)入org . apache . http . httphost;導(dǎo)入org . elastic search . client . rest client;導(dǎo)入org . elastic search . client . resthighlevelclient;導(dǎo)入org . spring framework . context . annotation . bean;導(dǎo)入org . spring framework . context . annotation . configuration;@configurationpublic類elasticsearchclientconfig { @ bean public resthighlevelclient resthighlevelclient{ resthighlevelclient = new resthighlevelclient(rest client . builder(new httphost( 127.0.0.1,9200, http )));回訪客戶;} }4.配置工具類封裝了es通用方法工具類。
包c(diǎn)om . hzx . utils;導(dǎo)入com . alibaba . fast json . json;import org . elastic search . action . admin . indexes . delete . deleteindexrequest;導(dǎo)入org . elastic search . action . bulk . bulk request;導(dǎo)入org . elastic search . action . bulk . bulk response;導(dǎo)入org . elastic search . action . delete . delete request;導(dǎo)入org . elastic search . action . delete . delete response;導(dǎo)入org . elastic search . action . get . get request;導(dǎo)入org . elastic search . action . get . getresponse;導(dǎo)入org . elastic search . action . index . index request;導(dǎo)入org . elastic search . action . index . index response;導(dǎo)入org . elastic search . action . search . search request;導(dǎo)入org . elastic search . action . search . search response;導(dǎo)入org . elastic search . action . support . master . acknowledged response;導(dǎo)入org . elastic search . action . update . update request;導(dǎo)入org . elastic search . action . update . update response;導(dǎo)入org . elastic search . client . request options;導(dǎo)入org . elastic search . client . resthighlevelclient;導(dǎo)入org.elasticsearch . client . indexes . createindexrequest;導(dǎo)入org . elastic search . client . indexes . createindexresponse;導(dǎo)入org . elastic search . client . indexes . getindexrequest;導(dǎo)入org . elastic search . common . unit . time value;導(dǎo)入org . elastic search . common . x content . xcontenttype;導(dǎo)入org . elastic search . index . query . query builders;導(dǎo)入org . elastic search . rest . rest status;導(dǎo)入org . elastic search . search . builder . search source builder;導(dǎo)入org . elastic search . search . fetch . sub phase . fetchsourcecontext;導(dǎo)入org . spring framework . beans . factory . annotation . auto wired;導(dǎo)入org . spring framework . beans . factory . annotation . qualifier;導(dǎo)入org . spring framework . stereotype . component;導(dǎo)入java . io . io exception;導(dǎo)入java . util . list;導(dǎo)入java . util . concurrent . time unit;@ component public class e sutilst { @ auto wired @ qualifier( resthighlevelclient )私有resthighlevelclient客戶端;/* * *判斷索引是否存在* * @ param index * @ return * @ throwsioexception */public boolean exists index(string index)throwsioexception { getindexrequestst = new getindexrequest(index);boolean exists = client.indices。存在(請(qǐng)求,請(qǐng)求選項(xiàng)。默認(rèn));退貨存在;}/* * * create index * * @ param index * @ throwsioexception */public boolean create index(string index)throwsioexception { createindexrequest = newcreateindexrequest(index);createindexresponse createindexresponse = client . indexes。創(chuàng)建(請(qǐng)求,請(qǐng)求選項(xiàng)。默認(rèn));返回createindexresponse . isacknowledged;}/* * * delete index * * @ param index * @ return * @ throwsioexception */public boolean delete index(string index)throwsioexception { deleteindexrequest deleteindexrequest = new deleteindexrequest(index);acknowledgedresponse response = client . indexes。delete(deleteindexrequest,requestoptions。默認(rèn));返回response . isackknowledged;}/* * *確定某個(gè)索引下的文檔id是否存在* * @ param index * @ param id * @ return * @ throwsioexception */public boolean doc exists(string index,string id)拋出io exception { getrequest getrequest = new getrequest(index,id);//只判斷索引是否存在。您需要獲取_ sourcegetrequest。fetchsourcecontext(new fetchsourcecontext(false));get request . stored fields( _ none _ );boolean exists = client . exists(get request,requestoptions。默認(rèn));退貨存在;}/* * *添加文檔記錄* * @ paramindex * @ paramid * @要添加的paramtdata實(shí)體類* @ return * @ throwsioexception */public boolean add doc(stringindex,stringind,t t)拋出io exception { index request request = new index request(index);request . id(id);//time out request . time out(time value . time value seconds(1));request . time out( 1s );request . source(json . tojsonstring(t),xcontenttype。json);indexresponse indexresponse = client . index(request,requestoptions。默認(rèn));reststatus status = index response . status;返回狀態(tài)== reststatus。ok || status == reststatus。已創(chuàng)建;}/* * *根據(jù)id獲取記錄* * @ param index * @ param id * @ return * @ throwsioexception */public getresponse getdoc(string index,string id)拋出io exception { getrequest request = new getrequest(index,id);getresponse getresponse = client . get(請(qǐng)求,r等式選項(xiàng)。默認(rèn));返回getresponse}/* * *批量添加單據(jù)記錄*如果沒有設(shè)置id es,系統(tǒng)會(huì)自動(dòng)生成一條。如果要設(shè)置對(duì)象。indexrequest的id,可以* * @ param index * @ param list * @ return * @ throwsioexception */public boolean bulk add(string index,listt list)拋出io exception { bulk request bulk request = new bulk request;//time out bulk request . time out(time value . time value minutes(2));bulk request . time out( 2m );for(int i = 0;i list . size;i){ bulk request . add(new index request(index))。source(json . tojsonstring(list . get(i))));} bulkresponse bulkresponse =客戶端. bulk(bulkrequest,requestoptions。默認(rèn));回歸!bulk response . has failures;}/* * *更新文檔記錄* @ param index * @ paramid * @ paramt * @ return * @ throwsioexception */public boolean updatedoc(string index,stringinid,t t)拋出io exception { update request request = new update request(index,id);request . doc(json . tojsonstring(t));request . time out(time value . time value seconds(1));request . time out( 1s );update response update response = client . update(請(qǐng)求,請(qǐng)求選項(xiàng)。默認(rèn));返回update response . status= = rest status。ok;}/* * *刪除文檔記錄* * @ param index * @ paramid * @ return * @ throwsioexception */public boolean deleted doc(string index,string id)拋出io exception { delete request request = new delete request(index,id);//time out request . time out(time value . time value seconds(1));request . time out( 1s );delete response delete response = client . delete(request,requestoptions。默認(rèn));返回delete response . status= = rest status。ok;}/* * *根據(jù)某個(gè)字段進(jìn)行搜索* * @ paramindex * @ paramfield * @要搜索的paramkey關(guān)鍵字* @ throwsioexception */public void search(string index,stringfield,string key,integer from,integer size)拋出io exception { search request search request = new search request(index);search source builder source builder = new search source builder;source builder . query(query builders . term query(field,key));//控制搜索元素source builder . from(from);sourcebuilder.size(大小);//最大搜索時(shí)間。sourcebuilder.timeout(新時(shí)間值(60,時(shí)間單位。秒));搜索請(qǐng)求est . source(source builder);search response search response = client . search(search request,requestoptions。默認(rèn));system . out . println(json . tojsonstring(search r測(cè)試測(cè)試創(chuàng)建了一個(gè)索引:
@testvoid testcreateindex拋出io exception { createindexrequest request = new createindexrequest( 測(cè)試索引 );createindexresponse createindexresponse = resthighlevelclient . indexes。創(chuàng)建(請(qǐng)求,請(qǐng)求選項(xiàng)。默認(rèn));system . out . println(cr測(cè)試得到指數(shù):
@testvoid testexistsindex拋出io exception { getindexrequest request = new getindexrequest( 測(cè)試索引 );boolean exists = resthighlevelcli測(cè)試刪除索引:
@ test void testdeleteindexrequest拋出io exception { deleteindexrequest deleteindexrequest = new deleteindexrequest( 測(cè)試索引 );acknowledgedresponse response = resthighlevelclient . indexes。delete(deleteindexrequest,requestoptions。默認(rèn));system . out . println(response . isacknowl測(cè)試補(bǔ)充文件記錄:
創(chuàng)建實(shí)體類用戶。
@ data @ allargsconstructor @ noargsconstructor @ component public class us測(cè)試添加文檔記錄。
@ test void testadddocumentthrowsioexception {//創(chuàng)建對(duì)象用戶用戶=新用戶( 張三 , 3);//create request index request = new index request( 測(cè)試索引 );//rule request . id( 1 );request . time out(time value . time value seconds(1));request . time out( 1s );request . source(json . tojsonstring(user),xcontenttype。json);//發(fā)送請(qǐng)求indexresponse indexresponse = resthighevelcli測(cè)試:判斷某個(gè)索引下的文檔id是否存在。
@ testvoid testisexists拋出io exception { get request get request = new get request( 測(cè)試索引 , 1 );//唐 t獲取_source上下文存儲(chǔ)字段getrequest。fetchsource上下文(新的fetchsource上下文xt(false));get request . stored fields( _ none _ );//判斷該id是否存在!boolean exists = resthighlevelcli測(cè)試:根據(jù)id獲取文檔記錄。
@testvoid testgetdocument拋出io exception { get request get request = new get request( 測(cè)試索引 , 3 );getresponse getresponse = resthighlevelclient . get(getrequest,requestoptions。默認(rèn));//打印文檔內(nèi)容系統(tǒng)。out . println(getresponse . getsourc測(cè)試:更新文檔記錄。
@testvoid testupdatedocument拋出io exception { update request request = new update request( 測(cè)試索引 , 1 );request . time out(time value . time value seconds(1));request . time out( 1s );用戶user =新用戶( 張三 , 18);request . doc(json . tojsonstring(user),xcontenttype。json);update response update response = resthighlevelcli測(cè)試:刪除文檔記錄。
@testvoid testdelete拋出ioexception { delete request request = new delete request( 測(cè)試索引 , 3 );//time out request . time out(time value . time value seconds(1));request . time out( 1s );delete response delete response = resthighlevelcli測(cè)試:批量添加文檔。
@testvoid testbulkrequest拋出io exception { bulk request bulk request = new bulk request;//time out bulk request . time out(time value . time value minutes(2));bulk request . time out( 2m );arraylistuser userlist = new arraylist;userlist.add(新用戶( 張三 ,3));userlist.add(新用戶( 張三 ,3));userlist.add(新用戶( 張三 ,3));userlist.add(新用戶( lisi1 ,3));userlist.add(新用戶( lisi2 ,3));userlist.add(新用戶( lisi3 ,3));for(int i = 0;iuser list . size;i){ bulk request . add(new index request( 測(cè)試索引 ).id( (i 1))。source(json . tojsonstring(userlist . get(i)),xcontenttype。json));}//bulk bulk response bulk response = resthighlevelcli測(cè)試:
/* * *使用查詢生成器* $ term查詢( 鑰匙和鑰匙,obj)來精確匹配* terms query( 鑰匙和鑰匙,obj1,obj2...)一次匹配多個(gè)值* match query( 鑰匙和鑰匙,obj)進(jìn)行單匹配,字段不支持通配符,前綴具有高級(jí)特性* multimatchquery( 文本 ,對(duì)象2..).匹配多個(gè)字段,字段有通配符te line * matchallquery;匹配所有文件*/@ test void test searchthrowsioexception { searchrequestsearchrequest = new search request( 測(cè)試索引 );search source builder source builder = new search source builder;//termquerybuilder termquerybuilder = query builders . term query( 姓名和名稱, 張三 );matchallquerybuilder matchallquerybuilder = query builders . matchallquery;source builder . query(matchallquerybuilder);sourcebuilder.timeout(新時(shí)間值(60,時(shí)間單位。秒));search request . source(source builder);search response response = resthighlevelclient . search(search request,requestoptions。默認(rèn));system . out . println(json . tojsonstring(response . get hits));系統(tǒng)。out . println( = = = = = = = = = = = =查詢突出顯示= = = = = = = = == = = = = = = = = = = );for(search hit docum:響應(yīng). gethits。get hits){ system . out . println(document fields . getsourceasmap);}}標(biāo)簽:
文件索引
了解更多spring boot integrated elastic search 7(spring boot integrated elastic search 6 . 5 . 4)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。