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

【elasticsearch】搜索结果处理

搜索结果处理

排序

elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

GET /indexName/_search
{"query":{"match_all":{}},"sort":[{"FIELD":"desc" //排序字段和排序方式ASC、DESC  升序、降序}]
}
GET /indexName/_search
{"query":{"match_all":{}},"sort":[{"_geo_distance":{"FIELD":"纬度,经度","order":"asc","unit":"km"  //单位}}]
}

GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"score": {"order": "desc"},"price": {"order": "asc"}}]
}

GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance": {"location": {"lat": 31,"lon": 121},"order": "asc","unit": "km"}}]
}

分页

elasticsearch默认情况下只返回top10的数据。而如果要查询更多的数据就需要修改分页参数了。

elasticsearch中通过修改from、size参数来控制要返回的分页结果

GET /hotel/_search
{"query":{"match_all":{}},"from":990, //分页开始的位置,默认为0"size":10, //期望获取的文档总数"sort":[{"price":"asc"}]
}
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"price":"asc"}],"from": 0,"size": 20
}

深度分页问题

ES是分布式的,所以会面临深度分页问题。例如price排序后,获取from=990,size=10的数据:

高亮处理

高亮:就是在搜索结果中把搜索关键字突出显示。

GET /hotel/_search
{"query":{"match":{"FIELD":"TEXT"  //不能为match_all{} 因为高亮一定是对某个字段进行高亮}},"highlight":{"fields":{    //高亮的字段不止一个"FIELD":{"pre_tags":"<em>", //用于标记高亮字段的前置标签"post_tags":"</em>" //用于标记高亮字段的后置标签}}}
}
GET /hotel/_search
{"query": {"match": {"all": "如家"}},"highlight": {"fields": {"name": {"require_field_match": "false","pre_tags": "<em>","post_tags": "</em>"}}}
}

RestClient查询文档

match_all

    void testMatchAll() throws IOException {//1.准备RequestSearchRequest request=new SearchRequest("hotel");//2.准备DSLrequest.source().query(QueryBuilders.matchAllQuery());//3.发送请求SearchResponse search = client.search(request, RequestOptions.DEFAULT);System.out.println(search);}

    void testMatchAll() throws IOException {//1.准备RequestSearchRequest request=new SearchRequest("hotel");//2.准备DSLrequest.source().query(QueryBuilders.matchAllQuery());//3.发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//解析结果SearchHits hits = response.getHits();//查询的总条数long total = hits.getTotalHits().value;System.out.println("一共搜索到 "+total+"数据");//查询hit数组SearchHit[] hits1 = hits.getHits();//遍历hit数组for(SearchHit hit : hits1){//得到sourceString json=hit.getSourceAsString();//反序列化HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);//打印System.out.println(hotelDoc);System.out.println();}}

全文检索查询

全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query部分。

multi_match:对多个字段进行查询。

    void testMulMatchAll() throws IOException {//创建requestSearchRequest request=new SearchRequest("hotel");//准备DSLSearchSourceBuilder query = request.source().query(QueryBuilders.matchQuery("all", "如家"));SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();TotalHits totalHits = hits.getTotalHits();System.out.println("搜索到的数据一共有:"+totalHits+"条");SearchHit[] hits1 = hits.getHits();for(SearchHit hit : hits1){String json = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);System.out.println();}}
    void testMulMatchAll1() throws IOException {//创建requestSearchRequest request=new SearchRequest("hotel");//准备DSLSearchSourceBuilder query = request.source().query(QueryBuilders.multiMatchQuery("如家","brand","name","business"));SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();TotalHits totalHits = hits.getTotalHits();System.out.println("搜索到的数据一共有:"+totalHits+"条");SearchHit[] hits1 = hits.getHits();for(SearchHit hit : hits1){String json = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);System.out.println();}}

精确查询

    void BooleanMatch() throws IOException {//1.准备RequestSearchRequest request=new SearchRequest("hotel");//准备DSL//准备BooleanQueryBoolQueryBuilder boolQuery=QueryBuilders.boolQuery();//添加termboolQuery.must(QueryBuilders.termQuery("city","北京"));boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));request.source().query(boolQuery);//发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();TotalHits totalHits = hits.getTotalHits();System.out.println("搜索到的数据一共有:"+totalHits+"条");SearchHit[] hits1 = hits.getHits();for(SearchHit hit : hits1){String json = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);System.out.println();}}

排序和分页

    void PageTest() throws IOException {//1.准备RequestSearchRequest request=new SearchRequest("hotel");//准备DSL//准备queryrequest.source().query(QueryBuilders.matchAllQuery());//排序request.source().sort("price", SortOrder.ASC);//分页request.source().from(0).size(5);//发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();TotalHits totalHits = hits.getTotalHits();System.out.println("搜索到的数据一共有:"+totalHits+"条");SearchHit[] hits1 = hits.getHits();for(SearchHit hit : hits1){String json = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);System.out.println();}}

高亮

void HighLightTest() throws IOException {//1.准备RequestSearchRequest request=new SearchRequest("hotel");//准备DSL//准备queryrequest.source().query(QueryBuilders.matchQuery("all","如家"));//高亮request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));//发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();TotalHits totalHits = hits.getTotalHits();System.out.println("搜索到的数据一共有:"+totalHits+"条");SearchHit[] hits1 = hits.getHits();for(SearchHit hit : hits1){String json = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);System.out.println();}
}

但是为什么没有出现高亮呢?

    void HighLightTest1() throws IOException {//1.准备RequestSearchRequest request=new SearchRequest("hotel");//准备DSL//准备queryrequest.source().query(QueryBuilders.matchQuery("all","如家"));//高亮request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));//发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();TotalHits totalHits = hits.getTotalHits();System.out.println("搜索到的数据一共有:"+totalHits+"条");SearchHit[] hits1 = hits.getHits();for(SearchHit hit : hits1){//获取高亮结果Map<String, HighlightField> highlightFields = hit.getHighlightFields();//根据字段名获取高亮结果HighlightField highlightField = highlightFields.get("name");if(highlightField!=null){//获取高亮值String string = highlightField.getFragments()[0].string();System.out.println(string);}}}

加粗样式

相关文章:

  • 【Docker】有用的命令
  • Docker Container(容器)
  • django rest framework 学习笔记-实战商城
  • c++的静态多态和动态多态
  • 《艾尔登法环 黄金树幽影》是什么?Mac电脑怎么玩《艾尔登法环》艾尔登法环下载
  • 五个使用Delphi语言进行开发的案例
  • [rust] 11 所有权
  • 网络原理 HTTP _ HTTPS
  • 跨环境前端组件库打包方案(node+esm)
  • 微信小程序 --- 通用模块封装(showToast,showModal ,本地存储)
  • wo-gradient-card是一款采用uniapp实现的透明辉光动画卡片
  • ELK入门(四)-logstash
  • petalinux_zynq7 驱动DAC以及ADC模块之六:qt显示adc波形
  • 十三、集合进阶——单列集合 及 数据结构
  • Java学习——ArrayList和LinkedList
  • const let
  • CSS相对定位
  • javascript 哈希表
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • springboot_database项目介绍
  • ViewService——一种保证客户端与服务端同步的方法
  • v-if和v-for连用出现的问题
  • vue-loader 源码解析系列之 selector
  • Wamp集成环境 添加PHP的新版本
  • 关于for循环的简单归纳
  • 回顾 Swift 多平台移植进度 #2
  • 区块链将重新定义世界
  • 网络应用优化——时延与带宽
  • 我感觉这是史上最牛的防sql注入方法类
  • 我建了一个叫Hello World的项目
  • 从如何停掉 Promise 链说起
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​configparser --- 配置文件解析器​
  • ​学习一下,什么是预包装食品?​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (12)Linux 常见的三种进程状态
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)逆序输出字符串
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (补)B+树一些思想
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (转)setTimeout 和 setInterval 的区别
  • (转)四层和七层负载均衡的区别
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET : 在VS2008中计算代码度量值
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Core WebAPI中封装Swagger配置
  • .Net的DataSet直接与SQL2005交互
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net图片验证码生成、点击刷新及验证输入是否正确