階段四-好客租房-學(xué)習(xí)之elasticsearch進階講義_第1頁
階段四-好客租房-學(xué)習(xí)之elasticsearch進階講義_第2頁
階段四-好客租房-學(xué)習(xí)之elasticsearch進階講義_第3頁
階段四-好客租房-學(xué)習(xí)之elasticsearch進階講義_第4頁
階段四-好客租房-學(xué)習(xí)之elasticsearch進階講義_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

SpringData、倒排索的各記錄的地址。由于不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱為倒排索引(ivrtedindx。帶有倒排索引的文件我們稱為倒排索引文件,簡稱倒排文件(ivrtedle)。正排索引轉(zhuǎn)化成倒排索引說明而事實上,索引系統(tǒng)還可以記錄除此之外的信息,在單詞對應(yīng)的倒排列表中不僅記錄了文檔編號,還記載了單詞頻率信息(),即這個單詞在某個文檔中的出現(xiàn)次數(shù),之所以要記錄這個信息,是因為詞頻信息在搜索結(jié)果排序時,計算查詢和文檔相似度是很重要的一個計算因子,所以將其記錄在倒排列表中,以方便后續(xù)排序時進行分值計算。倒排索引還可以記載的信息,除了記錄文檔編號和單詞頻率信息外,額外記載了兩類信息,即每個單詞對的文檔頻率信息,以及在倒排列表中記錄單詞在某個文檔出現(xiàn)的位置信息。、全文搜全文搜索兩個最重要的方面相關(guān)性(Relevance)它是評價查詢與其結(jié)果間的相關(guān)程度,并根據(jù)這種相關(guān)程度對結(jié)果的一種能力,這種計算方式可以是TF/IDF方法、地理位置鄰近、模糊相似,或其他的某些算法。分析(ysis)它是將文本塊轉(zhuǎn)換為有區(qū)別的、規(guī)范化的token的一個過程,目的是為了創(chuàng)建倒排索引以"hobby":"type":"text",}}}}}批量插入數(shù)據(jù) ","age":20,"mail":","hobby":"羽毛球、乒乓球、足球 ","age":21,"mail":","hobby":"羽毛球、乒乓球、足球、籃球 ","age":22,"mail":","hobby":"羽毛球、籃球、游泳、聽音樂 ","age":23,"mail":","hobby":"跑步、游泳、籃球 ","age":24,"mail":","hobby":"聽音樂、 、羽毛球結(jié)果"hobby""hobby":"音樂結(jié)果1 "took":"timed_out":"_shards":"total":"successful":"skipped":"failed": "hits":"total":"max_score": "hits": "_index": "_type": "_id":"Uv0cDWgBR-bSw8- "_score": "_source": "name": "age": "mail": "hobby":"羽毛球、籃球、游泳、聽音樂 "highlight": "hobby": "羽毛球、籃球、游泳、聽<em>音樂 "_index": "_type": "_id":"VP0cDWgBR-bSw8- "_score": "_source": "name": "age": "mail":" "hobby":"聽音樂、看 ]}50

"highlight":"hobby":"聽<em>音樂</em>、 、羽毛球]}}過程說明hobby字段是一個text類型(指定了IK分詞器),這意味著查詢字符串本身也應(yīng)該被分詞。分析查詢字符串將查詢的字符串“音樂”傳入IK分詞器中,輸出的結(jié)果是單個項音樂。因為只有一個單詞項,所以match查詢執(zhí)行的是單個底層term查詢。查找用term查詢在倒排索引中查找“音樂”然后獲取一組包含該項的文檔,本例的結(jié)果是文檔:3、5為每個文檔評分用term查詢計算每個文檔相關(guān)度評分_score,這是種將詞頻(termfrequency,即詞“音樂”在相關(guān)文檔的hobby字段中出現(xiàn)的頻率)和反向文檔頻率(inverse frequency,即詞“音樂”在所有文檔的hobby字段中出現(xiàn)的頻率),以及字段的長度(即字段越短相關(guān)度越高)相結(jié)合的計算方式。結(jié)果"_id":"Uv0cDWgBR-bSw8-

"_score": "_source":"name":" "age":22,"mail": "hobby":"羽毛球、籃球、游泳、聽音樂"highlight":"hobby":"羽毛球、<em>籃球</em>、游泳、聽<em>音樂]}"_index": "_type": "_id":"VP0cDWgBR-bSw8-LpdkZ","_score":0. "_source":"name":" "age":24,"mail":" "hobby":"聽音樂、看 "highlight":"hobby":"聽<em>音樂</em>、 、羽毛球]}"_index": "_type": "_id":"Vf0gDWgBR-bSw8-LOdm_","_score":0. "_source":"name":" "age":23,"mail":" "hobby":"跑步、游泳、籃球""highlight":"hobby":"跑步、游泳、<em>籃球]}"_index": "_type": "_id":"Uf0cDWgBR-bSw8-LpdkZ","_score":0. "_source":}}]}"name":"","age":21,"mail": "hobby":"羽毛球、乒乓球、足球、籃球"highlight":"hobby":"羽毛球、乒乓球、足球、<em>籃球]}可是,搜索的結(jié)果并不符合我們的預(yù)期,因為我們想搜索的是既包含音樂又包含籃球的用戶,顯然結(jié)果返回的或的關(guān)系。結(jié)果##設(shè)置40% 試可以看到結(jié)果符前面我們測試了“OR”和“AND”搜索,這是兩個,其實在實際場景中,并不會選取這2個,更有可能是選取示例1{2345"query":"游泳羽毛球67}8}9"highlight":"fields":"hobby":}}}#結(jié)果:省"hits":"total":4,#相似度為80%的情況下,查詢到4"max_score":"hits":}{"query":"游泳羽毛球",}}"highlight":"fields":"hobby":}}}"hits"total":5,#相似度為40%的情況下,查詢到5條數(shù)"max_score":1.621458,"hits":[}"hobby":"籃球"hobby":"音樂"hobby":"游泳}"highlight":"fields":"hobby":}}上面搜索的意思評分的計算規(guī)bool查詢會為每個文檔計算相關(guān)度評分_score,再將所有匹配的must和should語句的分數(shù)_score求和,最后除以must和should語句的總數(shù)。must_not語句不會影響評分;它的作用只是將不相關(guān)的文檔排除默認情況下,shold中的內(nèi)容不是必須匹配的,如果查詢語句中沒有ms,那么就會至少匹配其中一個。當然了,也可以通過iimum_shold_mtch參數(shù)進行控制,該值可以是數(shù)字也可以的百分比。示例"hobby""hobby":"游泳"hobby":"籃球"hobby":"音樂iium_shod_mch為2,意思是shod中的三個詞,至少要滿足2個。結(jié)果:有些時候,我們可能需要對某些詞增重來影響該條數(shù)據(jù)的得分。如下"query""query":"游泳籃球{"match":"hobby":"query"音樂","boost":10}}{"match":"hobby":"query"跑步","boost":2}}}]}"highlight":"fields":"hobby":}}}結(jié)果、短語匹"query""query":"羽毛球籃球結(jié)果結(jié)果如果覺得這樣太過于苛刻,可以增加slo參數(shù),允許跳過N結(jié)果"query""query":"羽毛球足球結(jié)果:沒有匹配到數(shù)設(shè)置跳過次數(shù)"query":"羽毛球足球結(jié)果、集群節(jié)Escsac的集群是由多個節(jié)點組成的,通過clstr.nm設(shè)置集群名稱,并且用于區(qū)分其它的集群,每個節(jié)點通過nod.nam指定節(jié)點的名稱。masterdata節(jié)配置文件中noe.astr屬性和no.dta屬性均為fse。該節(jié)點不能作為mastr節(jié)點,也不能作為data節(jié)點。當一個節(jié)點配置ti*的時候,它是一個特殊的客戶端,它可以連接多個集群,在所有連接的集群上執(zhí)行搜索和其他操作。、使用docker搭建123456789mkdir/haoke/es-clustercd/haoke/es-clustermkdirnode01mkdir#安 下的elasticsearch.yml、jvm.options文件,做如下修#node01的配置:es--cluster:node01node.master:truenode.data:truenetwork.host:85http.port:discovery.zen..unicast.hosts:discovery.zen.minimum_master_nodes:1http.cors.enabled:truehttp.cors.allow-origin:"*"#node02的配置:es--cluster:node02node.master:falsenode.data:truenetwork.host:85http.port:discovery.zen..unicast.hosts:discovery.zen.minimum_master_nodes:1http.cors.enabled:truehttp.cors.allow-origin:"*"#創(chuàng)建容dockercreate--namees-node01--nethost-v/haoke/es--v/haoke/es--v/haoke/es-cluster/node01/data:/usr/share/elasticsearch/datadockercreate--namees-node02--nethost-v/haoke/es--v/haoke/es--v/haoke/es-cluster/node02/data:/usr/share/elasticsearch/data#啟動容dockerstartes-node01&&dockerlogs-fes-dockerstartes-node02&&dockerlogs-fes-#提示:啟動時會報文件無權(quán)限操作的錯誤,需要對node01和node02進的操查看集群創(chuàng)建索引查詢集群狀態(tài) 響應(yīng)--"cluster_name":3}"status":"green","timed_out":false,"number_of_nodes":2,"number_of_data_nodes":"active_primary_shards":"active_shards":"relocating_shards":"initializing_shards":"unassigned_shards":"delayed_unassigned_shards":"number_of_pending_tasks":"number_of_in_flight_fetch":"task_max_waiting_in_queue_millis":"active_shards_percent_as_number":456789集群狀態(tài)的三種顏色顏意所有主要分片和分片都可所有主要分片可用,但不是所有分片都可不是所有的主要、分片和副為了將數(shù)據(jù)添加到Elsicsac,我們需要索引(indx)——一個關(guān)聯(lián)數(shù)據(jù)的地方。實際上,索引只是一個用來指向一個或多個分片(s)的“邏輯命名空間(loicalnamespace)”. 我們需要知道是分片就是一個Lucne實例,并且它本身就是一個完整的搜索引擎。應(yīng)用程序不會和它直接通信。分片可以是主分片(primaryshard)或者是分片(replicashard)者從別的shad取回文檔。、故障轉(zhuǎn)cluster/node03/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.ymlcluster/node03/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml-/haoke/es- -/haoke/es- 、將node01停說明將node02、將node02停解決方案思路:不能讓節(jié)點很容易的變成master設(shè)置iiummstr_ndes的大小為2、分布式文首先,來看個問 到哪個節(jié)點呢?是隨機嗎?是輪詢嗎這個on字符串通過哈希函數(shù)生成一個數(shù)字,然后除以主切片的數(shù)量得到一個余數(shù)(mindr)數(shù)的范圍是0到umer_f_rimryshads-,這個數(shù)字就是特定文檔所在的分片。這就是為什么創(chuàng)建了主分片后,不能修改的0客戶端 0節(jié)點使用文檔的_id確定文檔屬于分

。它轉(zhuǎn)發(fā)請

,分 位于這個節(jié)點上 在主分片上執(zhí)行請求,如果成功,它轉(zhuǎn)發(fā)請求到相應(yīng)的位于Node1和Node2的節(jié)點上。當 、搜索文檔(單個文檔文檔能夠從主分片或任意一個分片被檢索客戶

發(fā)送get請求確定文檔屬于分 。分 對應(yīng) 分片在三個節(jié)點上都有。此時,它轉(zhuǎn)發(fā)請Node Node返回文檔 ) 然后返回給客戶端可能的情況是,一個被索引的文檔已經(jīng)存在于主分片上卻還沒來得及同步到分片上。這時分片會報告文檔未找到,主分片會成功返回文檔。一旦索引請求成功返回給用戶,文檔則在主分片和分片都是可用的。查詢階段包含以search(搜索Node3,Node客戶端發(fā)送一 請求 創(chuàng)建search(搜索Node3,Node 每個分片返 的ID和它優(yōu)先隊列里的所 的排序值給協(xié)調(diào)節(jié) 把些值合并到自己的優(yōu)先隊列里產(chǎn)生全局排序結(jié)果分發(fā)階段由以下步驟構(gòu)成協(xié)調(diào)節(jié)點辨別出哪 需要取回,并且向相關(guān)分片發(fā)出GET請求每個分片加 并且根據(jù)需要豐富(enrich)它們,然后再 返回協(xié)調(diào)節(jié)點一旦所有的都被取回,協(xié)調(diào)節(jié)點會將結(jié)果返回給客戶端3、Java客戶在Elasticsearch中,為java提供了2種客戶端,一種是REST風格的客戶端,另一種是JavaAPI的客戶端、REST客戶JavaLwLvlRESTClit:提供的低級客戶端。該客戶端通過http來連接Elsicsach集群。用戶在使用該客戶端時需要將請求數(shù)據(jù)手動拼接成Elsseach所需JSON格式進行發(fā)送,收到響應(yīng)時同樣也需要將返回的JSON數(shù)據(jù)手動封裝成對象。雖然麻煩,不過該客戶端兼容所有的Elsseac本。JavaHighLevelRESTClient:提供的高級客戶端。該客戶端基于低級客戶端實現(xiàn),它提供了很多便捷API來解決低級客戶端需要手動轉(zhuǎn)換數(shù)據(jù)格式的問、構(gòu)造數(shù){"id":"1002","title":"陸家嘴板塊,精裝設(shè)計一室一廳,可拎包入住誠意租。{"id":"1004","title":"整租·中凱城市之光+視野開闊+景色秀麗+拎包入住{"id":"1006","title":"祥康里簡約風格*南戶型拎包入住看房隨時、REST創(chuàng)建工 <?xmlversion="1.0"encoding="UTF-xmlns:xsi="<artifactId>-<artifactId>elasticsearch-rest- piler-<encoding>UTF-123456789packagecn.importorg.apache.http.HttpHost;importorg.apache.http.util.EntityUtils;importorg.elasticsearch.client.*;importorg.junit.After;importorg.junit.Test;importjava.util.HashMap;importjava.util.Map;publicclassTestESRESTprivatestaticfinalObjectMapperMAPPER=newprivateRestClientpublicvoidinit()RestClientBuilderrestClientBuilder=RestClient.builder(newHttpHost("85",9200,"http"),newHttpHost("85",9201,"http"),newHttpHost("85",9202,"http"));restClientBuilder.setFailureListener(newRestClient.FailureListener()publicvoidonFailure(Nodenode)System.out.println("出錯了->"+ this.restClient= publicvoidafter()throwsIOException //查詢集群狀態(tài)publicvoidtestGetInfo()throwsIOExceptionRequestrequest=newRequest("GET",Responseresponse=this.restClient.performRequest(request); //新增數(shù)據(jù)publicvoidtestCreateData()throwsIOExceptionRequestrequest=newRequest("POST","/haoke/house");Map<String,Object>data=newdata.put("title","張江高科Responseresponse=this.restClient.performRequest(request); //根據(jù)id查詢數(shù)publicvoidtestQueryData()throwsIOException Responseresponse=this.restClient.performRequest(request); //搜索數(shù)據(jù)publicvoidtestSearchData()throwsIOExceptionRequestrequest=newRequest("POST",StringsearchJson="{\"query\":{\"match\":{\"title\":\"拎包入住 Responseresponse=}}從使用中,可以看出,基本和我們使用RESTfulapi使用幾乎是、REST<artifactId><artifactId>elasticsearch-rest-high-level-importimportimportimportimportimportimport30import31import32import34publicclassTestRestHighLevel{ privateRestHighLevelClientclient;publicvoidinit()RestClientBuilderrestClientBuilder= newHttpHost("85",9200, newHttpHost("85",9201, newHttpHost("85",9202, this.client=new publicvoidafter()throws{ *新增文檔**@throwspublicvoidtestCreate()throwsExceptionMap<String,Object>data=newdata.put("id",data.put("title"," 西路拎包入住一室一廳data.put("price",IndexRequestindexRequest=newIndexRequest("haoke",IndexResponseindexResponse=System.out.println("id->"+System.out.println("index->"+System.out.println("type->"+System.out.println("version->"+System.out.println("result->"+System.out.println("shardInfo->"+indexResponse.getShardInfo()); *新增文檔,異步操*{

*@throwspublicvoidtestCreateAsync()throwsMap<String,Object>data=newHashMap<>();data.put("id","2003");data.put("title", 東 房源二室一廳data.put("price",IndexRequestindexRequest=newIndexRequest("haoke",this.client.indexAsync(indexRequest,RequestOptions.DEFAULT,newActionListener<IndexResponse>(){publicvoidonResponse(IndexResponseindexResponse){System.out.println("id->"+indexResponse.getId());System.out.println("index->"+indexResponse.getIndex());System.out.println("type->"+indexResponse.getType());System.out.println("version->"+indexResponse.getVersion());System.out.println("result->"+indexResponse.getResult());System.out.println("shardInfo->"+indexResponse.getShardInfo());}publicvoidonFailure(Exceptione){}}publicvoidtestQuery()throwsExceptionGetRequestgetRequest=newGetRequest("haoke","house",//指定返回的字String[]includes=newString[]{"title","id"};String[]excludes=Strings.EMPTY_ARRAY;FetchSourceContextfetchSourceContext=GetResponseresponse=this.client.get(getRequest,System.out.println("數(shù)據(jù)->"+} *判斷是否存在**@throwspublicvoidtestExists()throwsException GetRequestgetRequest=newGetRequest("haoke","house", //不返回的字 getRequest.fetchSourceContext(new booleanexists=this.client.exists(getRequest,RequestOptions.DEFAULT); System.out.println("exists->"+ *刪除數(shù)據(jù)**@throwspublicvoidtestDelete()throwsException DeleteRequestdeleteRequest=newDeleteRequest("haoke","house", DeleteResponseresponse=this.client.delete(deleteRequest,System.out.println(response.status());//OKor *更新數(shù)據(jù)**@throwspublicvoidtestUpdate()throwsException UpdateRequestupdateRequest=newUpdateRequest("haoke","house",Map<String,Object>data=newdata.put("title","張江高科data.put("price", UpdateResponseresponse=this.client.update(updateRequest,System.out.println("version->"+ *測試**@throwspublicvoidtestSearch()throwsExceptionSearchRequestsearchRequest=newSearchSourceBuildersourceBuilder=newsourceBuilder.query(QueryBuilders.matchQuery("title","拎包入住sourceBuilder.timeout(newTimeValue(60,System.out.println

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論