当前位置: 首页 > news >正文

wordpress大学主惠州百度关键词优化

wordpress大学主,惠州百度关键词优化,网站地图怎么做XML,叶榭做网站一、前言 不同于之前的term。terms等结构化查询#xff0c;全文搜索首先对查询词进行分析#xff0c;然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据#xff08;text类型#xff09;,默认的数据形式是人类的自然语言#xff0c;如对话内容、图书名…一、前言 不同于之前的term。terms等结构化查询全文搜索首先对查询词进行分析然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据text类型,默认的数据形式是人类的自然语言如对话内容、图书名称、商品介绍和酒店名称等。结构化搜索关注的是数据是否匹配全文搜索关注的是匹配程度结构化搜索一般用于精确匹配而全文搜索用于部分匹配。本章将详细介绍使用最多的全文搜索。 二、match查询 match查询是全文搜索的主要代表。对于最基本的match搜索来说只要分词中的一个或者多个在文档中存在即可。例如搜索“京盛酒店”查询词先被分词器切分为“京”“盛”“酒”“店”因此只要文档中包含这4个字中的任何一个字都会被搜索到。 您可能会有疑问为什么“京盛酒店被切分为4个字而不是“京盛”“酒店”两个词呢这是因为在默认情况下match查询使用的是标准分词器。该分词器比较适用于英文如果是中文则按照字进行切分因此默认的分词器不适合做中文搜索在后面的章节中将介绍如何安装和使用中文分词器。 以下DSL示例为按照标题搜索“京盛酒店” POST /hotel/_search {query: {match: { //匹配title字段为金都酒店的文档title: 京盛酒店}} }或者按照如下形式搜索 POST /hotel/_search {query: {match: {title: {query: 京盛酒店}}} }搜索结果如下 {...hits : {total : {value : 3,relation : eq},max_score : 1.3428942,hits : [{_index : hotel,_type : _doc,_id : 002,_score : 1.3428942,_source : {title : 京盛酒店,city : 北京,price : 337.00,create_time : 2020-07-29 13:00:00,amenities : 充电停车场/可升降停车场,full_room : false,location : {lat : 39.911543,lon : 116.403},praise : 60}},{_index : hotel,_type : _doc,_id : 30,_score : 1.2387041,_source : {title : 京盛酒小店,city : 上海,price : 300.00,create_time : 2022-01-29 22:52:00,amenities : 露天游泳池,普通/充电停车场,full_room : false,praise : 2000}},{_index : hotel,_type : _doc,_id : 27,_score : 0.5495611,_source : {title : 盛况精选酒店,city : 南昌,price : 900.00,create_time : 2022-07-29 22:50:00,amenities : 露天游泳池,普通/充电停车场,full_room : false,location : {lat : 56.918229,lon : 126.422011},praise : 200}}]} }从结果中可以看到匹配度最高的文档是002该酒店的名称和查询词相同得分为1.3428942次之的文档是30因为该酒店名称中包含“京”“盛”“酒”“店”。但是想比前一个文档多了一个“小”字所以部分匹配。再次之的文档是27它只有“盛”“酒”“店”三个字和查询词部分匹配因此排在最后。 假设用户搜索名称中同时包含“京”和“盛”的酒店显然之前最后一个文档27就不是用户想要命中的文档。那么在ES中match搜索可以设置operator参数该参数决定文档按照分词后的词集合进行“与”还是“或”匹配。在默认情况下该参数的值为“或”关系即operator的值为or这也解释了搜索结果中包含部分匹配的文档。如果希望各个词之间的匹配结果是“与”关系则可以设置operator参数的值为and。 下面的请求示例设置查询词之间的匹配结果为“与”关系 POST /hotel/_search {query: {match: {title: {query: 京盛酒店,operator: and}}} }搜索结果如下 {...hits : {total : {value : 2,relation : eq},max_score : 1.3428942,hits : [{_index : hotel,_type : _doc,_id : 002,_score : 1.3428942,_source : {title : 京盛酒店,city : 北京,price : 337.00,create_time : 2020-07-29 13:00:00,amenities : 充电停车场/可升降停车场,full_room : false,location : {lat : 39.911543,lon : 116.403},praise : 60}},{_index : hotel,_type : _doc,_id : 30,_score : 1.2387041,_source : {title : 京盛酒小店,city : 上海,price : 300.00,create_time : 2022-01-29 22:52:00,amenities : 露天游泳池,普通/充电停车场,full_room : false,praise : 2000}}]} }有时搜索多个关键字关键词和文档在某一个比例上匹配即可如果使用“与”操作过于严苛如果使用“或”操作又过于宽松。这时可以采用minimum_should_match参数该参数叫作最小匹配参数其值为一个数值意义为可以匹配上的词的个数.在一般情况下将其设置为一个百分数因为在真实场景中并不能精确控制具体的匹配数量。以下示例设置最小匹配为80%的文档 POST /hotel/_search {query: {match: {title: {query: 京盛酒店,operator: or,minimum_should_match: 80% //设置最小匹配度为80%}}} }这样的话就需要满足最后命中的文档字数占查询条件中“京盛酒店”的80%向下取整例如这里4*80%其实查询结果只需要有条件中任意三个字符即可。 在Java客户端上可以使用QueryBuilders.matchQuery()方法构建match请求分别给该方法传入字段名称和查询值即可进行match查询。以下代码展示了match请求的使用逻辑 service层 public ListHotel matchQuery(HotelDocRequest hotelDocRequest) throws IOException {//新建搜索请求String indexName getNotNullIndexName(hotelDocRequest);SearchRequest searchRequest new SearchRequest(indexName);SearchSourceBuilder searchSourceBuilder new SearchSourceBuilder();//查询title且查询值之间关系是or并且最小匹配参数为80%MatchQueryBuilder matchQueryBuilder new MatchQueryBuilder(title, hotelDocRequest.getTitle()).operator(Operator.OR).minimumShouldMatch(80%);searchSourceBuilder.query(matchQueryBuilder);searchRequest.source(searchSourceBuilder);return getQueryResult(searchRequest);}controller层 PostMapping(/query/match)public FoundationResponseListHotel matchQuery(RequestBody HotelDocRequest hotelDocRequest) {try {ListHotel hotelList esQueryService.matchQuery(hotelDocRequest);if (CollUtil.isNotEmpty(hotelList)) {return FoundationResponse.success(hotelList);} else {return FoundationResponse.error(100,no data);}} catch (IOException e) {log.warn(搜索发生异常原因为:{}, e.getMessage());return FoundationResponse.error(100, e.getMessage());} catch (Exception e) {log.error(服务发生异常原因为:{}, e.getMessage());return FoundationResponse.error(100, e.getMessage());}}postman调用截图 三、multi_match查询 有时用户需要在多个字段中查询关键词除了使用布尔查询封装多个match查询之外可替代的方案是使用multi_match。可以在multi_match的query子句中组织数据匹配规则并在fields子句中指定需要搜索的字段列表。 下面的示例在title和amenities两个字段中同时搜索“假日”关键词 POST /hotel/_search {query: {multi_match: {query: 假日,fields: [amenities,title]}} }搜索结果如下 {took : 14,timed_out : false,_shards : {total : 1,successful : 1,skipped : 0,failed : 0},hits : {total : {value : 4,relation : eq},max_score : 4.2939954,hits : [{_index : hotel,_type : _doc,_id : 28,_score : 4.2939954,_source : {title : 京盛假日酒店,city : 上海,price : 600.00,create_time : 2021-04-29 22:52:00,amenities : 露天游泳池,普通/充电停车场,full_room : false,praise : 200}},{_index : hotel,_type : _doc,_id : 003,_score : 1.9696801,_source : {title : 文雅文化酒店,city : 天津,price : 260.00,create_time : 2021-02-27 22:00:00,amenities : 提供假日party,免费早餐,浴池充电停车场,full_room : true,location : {lat : 39.186555,lon : 117.162767},praise : 30}},{_index : hotel,_type : _doc,_id : 29,_score : 1.9163029,_source : {title : 京盛欣欣酒店,city : 上海,price : 700.00,create_time : 2022-01-29 22:52:00,amenities : 提供假日party,露天游泳池,普通/充电停车场,full_room : false,praise : 200}},{_index : hotel,_type : _doc,_id : 004,_score : 1.6876338,_source : {title : 京盛集团酒店,city : 上海,price : 800.00,create_time : 2021-05-29 21:35:00,amenities : 浴池(假日需预订),室内游泳池,普通停车场/充电停车场,full_room : true,location : {lat : 36.940243,lon : 120.394},praise : 100}}]} }根据结果可以看到命中的文档要么在title中包含“假日”关键词要么在amenities字段中包含“假日”关键词。 且之前在Match搜索讲到的operatorminimum_should_match等参数在multi_match搜索中同样适用。 在Java客户端上可以使用QueryBuilders.multiMatchQuery()方法或者直接new MultiMatchQueryBuilder()构建multi_match请求 可以看到我们构造MultiMatchQueryBuilder除了查询值字段它接收的是一个可变长String数组 所以我们可以在传参hotelDocRequest加两个参数一个是multiQueryValue代表要查询的值另一个是multiQueryPropertyNames代表想要在哪些字段查询 分别给该方法传入查询值和多个字段名称即可进行multi_match查询。以下代码展示了multi_match请求的使用逻辑 Service层 由于上面讲到构造MultiMatchQueryBuilder接收的是可变长String数组所以我们要对传参的List通过list.stream().toArray(String[]::new);转化为String可变长数组String…等价于String[]。 public ListHotel multiMatchQuery(HotelDocRequest hotelDocRequest) throws IOException {//新建搜索请求String indexName getNotNullIndexName(hotelDocRequest);SearchRequest searchRequest new SearchRequest(indexName);SearchSourceBuilder searchSourceBuilder new SearchSourceBuilder();MultiMatchQueryBuilder multiMatchQueryBuilder new MultiMatchQueryBuilder(hotelDocRequest.getMultiQueryValue(), hotelDocRequest.getMultiQueryPropertyNames().toArray(new String[0]));searchSourceBuilder.query(multiMatchQueryBuilder);searchRequest.source(searchSourceBuilder);return getQueryResult(searchRequest);}controller层 PostMapping(/query/multiMatch)public FoundationResponseListHotel multiMatchQuery(RequestBody HotelDocRequest hotelDocRequest) {try {ListHotel hotelList esQueryService.multiMatchQuery(hotelDocRequest);if (CollUtil.isNotEmpty(hotelList)) {return FoundationResponse.success(hotelList);} else {return FoundationResponse.error(100,no data);}} catch (IOException e) {log.warn(搜索发生异常原因为:{}, e.getMessage());return FoundationResponse.error(100, e.getMessage());} catch (Exception e) {log.error(服务发生异常原因为:{}, e.getMessage());return FoundationResponse.error(100, e.getMessage());}}postman运行截图 四、match_phrase查询 match_phrase用于匹配短语与match查询不同的是match_phrase用于搜索确切的短语或临近的词语。假设在酒店标题中搜索“京盛酒店”希望酒店标题中的“京盛酒店”四字完全按照搜索词的顺序并且紧邻此时就需要使用match_phrase查询 POST /hotel/_search {query: {match_phrase: {title: {query: 京盛酒店}}} }结果如下 {...hits : {total : {value : 1,relation : eq},max_score : 1.3428942,hits : [{_index : hotel,_type : _doc,_id : 002,_score : 1.3428942,_source : {title : 京盛酒店,city : 北京,price : 337.00,create_time : 2020-07-29 13:00:00,amenities : 充电停车场/可升降停车场,full_room : false,location : {lat : 39.911543,lon : 116.403},praise : 60}}]} }根据上述结果可知使用match_phrase查询后只有文档002命中而类似之前的“京盛集团酒店”等类似文档没有被命中这是为什么呢 我们知道在默认标准分词器的情况下文档002的title字段被切分为“京”“盛”“酒”“店”其中这些分词后的文档下标“京”代表0盛”代表1“酒”代表2“店”代表3而对于match_phrase查询在不去设置下标移动步长的情况下这些分词文档想要移动到理想位置查询词的位置这里就是京盛酒店的步数默认就是0而可以发现我们命中的文档002“京盛酒店”这个文档下标其实就已经是理想位置了不需要额外移动相当于步长就是0所以能够命中。而对于“京盛集团酒店”分词后“盛”想要移动到“酒”这个下标需要移动2次所以步长是2不符合默认的步长所以无法命中。 那么如果需要“京盛集团酒店”也能够被命中则可以设置match_phrase查询的slop参数它用来调节匹配词之间的距离阈值即上面说的步长下面的DSL将slop设置为2 POST /hotel/_search {query: {match_phrase: {title: {query: 京盛酒店,slop:2}}} }可以看到这样就能命中“京盛集团酒店”了 在Java客户端上可以使用QueryBuilders.matchPhraseQuery()方法构建match_phrase请求分别给该方法传入查询字段和值即可运行multi_match查询。这一点和match搜索很像。以下代码展示了match_phrase请求的使用逻辑 Service层 public ListHotel matchPhraseQuery(HotelDocRequest hotelDocRequest) throws IOException {//新建搜索请求String indexName getNotNullIndexName(hotelDocRequest);SearchRequest searchRequest new SearchRequest(indexName);SearchSourceBuilder searchSourceBuilder new SearchSourceBuilder();//构造MatchPhraseQueryBuilder且设置步长为2MatchPhraseQueryBuilder matchPhraseQueryBuilder new MatchPhraseQueryBuilder(title, hotelDocRequest.getTitle()).slop(2);searchSourceBuilder.query(matchPhraseQueryBuilder);searchRequest.source(searchSourceBuilder);return getQueryResult(searchRequest);}Controller层 PostMapping(/query/matchPhrase)public FoundationResponseListHotel matchPhraseQuery(RequestBody HotelDocRequest hotelDocRequest) {try {ListHotel hotelList esQueryService.matchPhraseQuery(hotelDocRequest);if (CollUtil.isNotEmpty(hotelList)) {return FoundationResponse.success(hotelList);} else {return FoundationResponse.error(100,no data);}} catch (IOException e) {log.warn(搜索发生异常原因为:{}, e.getMessage());return FoundationResponse.error(100, e.getMessage());} catch (Exception e) {log.error(服务发生异常原因为:{}, e.getMessage());return FoundationResponse.error(100, e.getMessage());}}Postman运行截图
http://www.hkea.cn/news/14259849/

相关文章:

  • 无锡加盟网站建设外贸流程实训报告
  • 沈阳企业制作网站最新注册公司流程及费用
  • 特色的企业网站建设如何自己做网站赚钱
  • 所有爱做网站产品互联网营销推广
  • 微信网站怎么做的好处wordpress站点图标
  • 昆明制作网站公司网站如何做背景音乐
  • 广州化妆品网站设计企业网站建设需要哪些费用
  • win7本地架设网站河间网站建设公司
  • 厦门企业建站模板网站建设代码走查
  • 静态网站做等级保护深圳营销型网站制作建设
  • 2345网址导航官网下载安装东莞网站优化怎样
  • 网上代理 建网站如何做好网站站内优化
  • 厦门 外贸商城网站制作网站排名优化方案
  • 企业网站seo优化交流电子手工外发加工网
  • 商业网站建设案例教程微信朋友圈怎么投放广告
  • 移动微网站开发平面设计主要做什么工作
  • 别人网站 自己的二级域名wordpress底部版权备案
  • 赤峰建设局网站wordpress在IE9显示错位
  • 二七免费网站建设大连住房和城乡建设部网站
  • 电子产品配件采购网站文具网站建设合同书
  • 在线做logo印章网站怎样进行seo
  • 网站建设 腾个人网站备案 流程
  • 为什么最近好多网站打不开了wordpress ios app
  • 网站搭建设计是什么wordpress模板引擎
  • seo网站推广工作内容网站首页开发
  • 绍兴网站定制公司吴忠网站建设报价
  • 网站建设费用自建网站建设结单 优帮云
  • vps 网站攻击ip地址网站建设可以学吗
  • 汽车网站建设背景虚拟机做局域网网站服务器配置
  • wordpress分类网站上海网络营销推广方法