阶段四-好客租房-学习之elasticsearch进阶讲义_第1页
阶段四-好客租房-学习之elasticsearch进阶讲义_第2页
阶段四-好客租房-学习之elasticsearch进阶讲义_第3页
阶段四-好客租房-学习之elasticsearch进阶讲义_第4页
阶段四-好客租房-学习之elasticsearch进阶讲义_第5页
免费预览已结束,剩余40页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SpringData、倒排索的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(ivrtedindx。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(ivrtedle)。正排索引转化成倒排索引说明而事实上,索引系统还可以记录除此之外的信息,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(),即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。倒排索引还可以记载的信息,除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对的文档频率信息,以及在倒排列表中记录单词在某个文档出现的位置信息。、全文搜全文搜索两个最重要的方面相关性(Relevance)它是评价查询与其结果间的相关程度,并根据这种相关程度对结果的一种能力,这种计算方式可以是TF/IDF方法、地理位置邻近、模糊相似,或其他的某些算法。分析(ysis)它是将文本块转换为有区别的、规范化的token的一个过程,目的是为了创建倒排索引以"hobby":"type":"text",}}}}}批量插入数据 ","age":20,"mail":","hobby":"羽毛球、乒乓球、足球 ","age":21,"mail":","hobby":"羽毛球、乒乓球、足球、篮球 ","age":22,"mail":","hobby":"羽毛球、篮球、游泳、听音乐 ","age":23,"mail":","hobby":"跑步、游泳、篮球 ","age":24,"mail":","hobby":"听音乐、 、羽毛球结果"hobby""hobby":"音乐结果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分词器),这意味着查询字符串本身也应该被分词。分析查询字符串将查询的字符串“音乐”传入IK分词器中,输出的结果是单个项音乐。因为只有一个单词项,所以match查询执行的是单个底层term查询。查找用term查询在倒排索引中查找“音乐”然后获取一组包含该项的文档,本例的结果是文档:3、5为每个文档评分用term查询计算每个文档相关度评分_score,这是种将词频(termfrequency,即词“音乐”在相关文档的hobby字段中出现的频率)和反向文档频率(inverse frequency,即词“音乐”在所有文档的hobby字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。结果"_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>篮球]}可是,搜索的结果并不符合我们的预期,因为我们想搜索的是既包含音乐又包含篮球的用户,显然结果返回的或的关系。结果##设置40% 试可以看到结果符前面我们测试了“OR”和“AND”搜索,这是两个,其实在实际场景中,并不会选取这2个,更有可能是选取示例1{2345"query":"游泳羽毛球67}8}9"highlight":"fields":"hobby":}}}#结果:省"hits":"total":4,#相似度为80%的情况下,查询到4"max_score":"hits":}{"query":"游泳羽毛球",}}"highlight":"fields":"hobby":}}}"hits"total":5,#相似度为40%的情况下,查询到5条数"max_score":1.621458,"hits":[}"hobby":"篮球"hobby":"音乐"hobby":"游泳}"highlight":"fields":"hobby":}}上面搜索的意思评分的计算规bool查询会为每个文档计算相关度评分_score,再将所有匹配的must和should语句的分数_score求和,最后除以must和should语句的总数。must_not语句不会影响评分;它的作用只是将不相关的文档排除默认情况下,shold中的内容不是必须匹配的,如果查询语句中没有ms,那么就会至少匹配其中一个。当然了,也可以通过iimum_shold_mtch参数进行控制,该值可以是数字也可以的百分比。示例"hobby""hobby":"游泳"hobby":"篮球"hobby":"音乐iium_shod_mch为2,意思是shod中的三个词,至少要满足2个。结果:有些时候,我们可能需要对某些词增重来影响该条数据的得分。如下"query""query":"游泳篮球{"match":"hobby":"query"音乐","boost":10}}{"match":"hobby":"query"跑步","boost":2}}}]}"highlight":"fields":"hobby":}}}结果、短语匹"query""query":"羽毛球篮球结果结果如果觉得这样太过于苛刻,可以增加slo参数,允许跳过N结果"query""query":"羽毛球足球结果:没有匹配到数设置跳过次数"query":"羽毛球足球结果、集群节Escsac的集群是由多个节点组成的,通过clstr.nm设置集群名称,并且用于区分其它的集群,每个节点通过nod.nam指定节点的名称。masterdata节配置文件中noe.astr属性和no.dta属性均为fse。该节点不能作为mastr节点,也不能作为data节点。当一个节点配置ti*的时候,它是一个特殊的客户端,它可以连接多个集群,在所有连接的集群上执行搜索和其他操作。、使用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:"*"#创建容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-#提示:启动时会报文件无权限操作的错误,需要对node01和node02进的操查看集群创建索引查询集群状态 响应--"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集群状态的三种颜色颜意所有主要分片和分片都可所有主要分片可用,但不是所有分片都可不是所有的主要、分片和副为了将数据添加到Elsicsac,我们需要索引(indx)——一个关联数据的地方。实际上,索引只是一个用来指向一个或多个分片(s)的“逻辑命名空间(loicalnamespace)”. 我们需要知道是分片就是一个Lucne实例,并且它本身就是一个完整的搜索引擎。应用程序不会和它直接通信。分片可以是主分片(primaryshard)或者是分片(replicashard)者从别的shad取回文档。、故障转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停解决方案思路:不能让节点很容易的变成master设置iiummstr_ndes的大小为2、分布式文首先,来看个问 到哪个节点呢?是随机吗?是轮询吗这个on字符串通过哈希函数生成一个数字,然后除以主切片的数量得到一个余数(mindr)数的范围是0到umer_f_rimryshads-,这个数字就是特定文档所在的分片。这就是为什么创建了主分片后,不能修改的0客户端 0节点使用文档的_id确定文档属于分

。它转发请

,分 位于这个节点上 在主分片上执行请求,如果成功,它转发请求到相应的位于Node1和Node2的节点上。当 、搜索文档(单个文档文档能够从主分片或任意一个分片被检索客户

发送get请求确定文档属于分 。分 对应 分片在三个节点上都有。此时,它转发请Node Node返回文档 ) 然后返回给客户端可能的情况是,一个被索引的文档已经存在于主分片上却还没来得及同步到分片上。这时分片会报告文档未找到,主分片会成功返回文档。一旦索引请求成功返回给用户,文档则在主分片和分片都是可用的。查询阶段包含以search(搜索Node3,Node客户端发送一 请求 创建search(搜索Node3,Node 每个分片返 的ID和它优先队列里的所 的排序值给协调节 把些值合并到自己的优先队列里产生全局排序结果分发阶段由以下步骤构成协调节点辨别出哪 需要取回,并且向相关分片发出GET请求每个分片加 并且根据需要丰富(enrich)它们,然后再 返回协调节点一旦所有的都被取回,协调节点会将结果返回给客户端3、Java客户在Elasticsearch中,为java提供了2种客户端,一种是REST风格的客户端,另一种是JavaAPI的客户端、REST客户JavaLwLvlRESTClit:提供的低级客户端。该客户端通过http来连接Elsicsach集群。用户在使用该客户端时需要将请求数据手动拼接成Elsseach所需JSON格式进行发送,收到响应时同样也需要将返回的JSON数据手动封装成对象。虽然麻烦,不过该客户端兼容所有的Elsseac本。JavaHighLevelRESTClient:提供的高级客户端。该客户端基于低级客户端实现,它提供了很多便捷API来解决低级客户端需要手动转换数据格式的问、构造数{"id":"1002","title":"陆家嘴板块,精装设计一室一厅,可拎包入住诚意租。{"id":"1004","title":"整租·中凯城市之光+视野开阔+景色秀丽+拎包入住{"id":"1006","title":"祥康里简约风格*南户型拎包入住看房随时、REST创建工 <?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 //查询集群状态publicvoidtestGetInfo()throwsIOExceptionRequestrequest=newRequest("GET",Responseresponse=this.restClient.performRequest(request); //新增数据publicvoidtestCreateData()throwsIOExceptionRequestrequest=newRequest("POST","/haoke/house");Map<String,Object>data=newdata.put("title","张江高科Responseresponse=this.restClient.performRequest(request); //根据id查询数publicvoidtestQueryData()throwsIOException Responseresponse=this.restClient.performRequest(request); //搜索数据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("数据->"+} *判断是否存在**@throwspublicvoidtestExists()throwsException GetRequestgetRequest=newGetRequest("haoke","house", //不返回的字 getRequest.fetchSourceContext(new booleanexists=this.client.exists(getRequest,RequestOptions.DEFAULT); System.out.println("exists->"+ *删除数据**@throwspublicvoidtestDelete()throwsException DeleteRequestdeleteRequest=newDeleteRequest("haoke","house", DeleteResponseresponse=this.client.delete(deleteRequest,System.out.println(response.status());//OKor *更新数据**@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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论