RestHighLevelClient操作es查询文档

server/2024/10/22 6:26:57/

目录

利用RestHighLevelClient客户端操作es查询文档

查询match_all

dsl语句:

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;">​编辑 java代码

小结

 match字段全文检索查询

dsl语句

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;">java代码

 multi_match多字段全文检索查询

dsl语句

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;"> java代码

term精确查询

dsl语句

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;">java代码

range范围查询

dsl语句

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;">java代码

 bool查询

dsl语句

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;">java代码

 算分查询

dsl语句

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;">java代码

 排序和分页

dsl语句

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;">java代码

 高亮显示

dsl语句

java%E4%BB%A3%E7%A0%81-toc" style="margin-left:80px;">​编辑 java代码


利用RestHighLevelClient客户端操作es查询文档

查询match_all

dsl语句:

java%E4%BB%A3%E7%A0%81"> java代码

  • 第一步,创建SearchRequest对象,指定索引库名

  • 第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等

    • query():代表查询条件,利用QueryBuilders.matchAllQuery()构建一个match_all查询的DSL
  • 第三步,利用client.search()发送请求,得到响应

java">@SpringBootTest
public class TestSearch {@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 测试全文查询match_all*/@Testpublic void test01() throws IOException {//1.构建 查询对象SearchRequest request = new SearchRequest("hotel");//2.设置DSL语句request.source().query(QueryBuilders.matchAllQuery());//3.发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//4.解析数据SearchHits hits = response.getHits();//5.1 获取当前条件命中的文档数量long value = hits.getTotalHits().value;//5.2 获取命中的文档SearchHit[] hitsHits = hits.getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {{    for (SearchHit hitsHit : hitsHits) {String jsonData = hitsHit.getSourceAsString();HotelDoc doc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(doc);}}System.out.println(docs);}
}

 

elasticsearch返回的结果是一个JSON字符串,结构包含:

  • hits:命中的结果
    • total:总条数,其中的value是具体的总条数值
    • max_score:所有结果中得分最高的文档的相关性算分
    • hits:搜索结果的文档数组,其中的每个文档都是一个json对象
      • _source:文档中的原始数据,也是json对象

因此,我们解析响应结果,就是逐层解析JSON字符串,流程如下:

  • SearchHits:通过response.getHits()获取,就是JSON中的最外层的hits,代表命中的结果
    • SearchHits.getTotalHits().value:获取总条数信息
    • SearchHits.getHits():获取SearchHit数组,也就是文档数组
      • SearchHit.getSourceAsString():获取文档结果中的_source,也就是原始的json文档数据

小结

查询的基本步骤是:

  1. 创建SearchRequest对象

  2. 准备Request.source(),也就是DSL。

    ① QueryBuilders来构建查询条件

    ② 传入Request.source() 的 query() 方法

  3. 发送请求,得到结果

  4. 解析结果(参考JSON结果,从外到内,逐层解析)

 match字段全文检索查询

dsl语句

java%E4%BB%A3%E7%A0%81">java代码

java">/*** 单字段全文检索查询*/@Testpublic void test02() throws IOException {//构建 查询对象SearchRequest request = new SearchRequest("hotel");//设置DSL语句//第一个参数是参与匹配的字段名,第二个参数是搜索内容request.source().query(QueryBuilders.matchQuery("all","上海外滩"));//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//解析数据SearchHits hits = response.getHits();long value = hits.getTotalHits().value;//获取命中文档数SearchHit[] hitsHits = hits.getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hitsHit : hitsHits) {String jsonData = hitsHit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 multi_match多字段全文检索查询

dsl语句

java%E4%BB%A3%E7%A0%81"> java代码

java">    /*** 多字段匹配查询*/@Testpublic void test03() throws IOException {//构建 搜索请求对象SearchRequest request = new SearchRequest("hotel");//设置DSL语句request.source().query(QueryBuilders.multiMatchQuery("上海外滩","city","name","brand"));//发送请求SearchResponse response = restHighLevelClient.search(request,RequestOptions.DEFAULT);//解析结果SearchHits hits = response.getHits();//获取命中结果数long value = hits.getTotalHits().value;//获取文档对象SearchHit[] hitsHits = hits.getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hitsHit : hitsHits) {String jsonData = hitsHit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

term精确查询

dsl语句

java代码

java">    /*** 精确查询*/@Testpublic void test04() throws IOException {//构建 搜索对象SearchRequest request = new SearchRequest("hotel");//设置DSL语句request.source().query(QueryBuilders.termQuery("city","上海"));//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//解析数据SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

range范围查询

dsl语句

java代码

java">    /*** range范围查询*/@Testpublic void test05() throws IOException {//构建 查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句request.source().query(QueryBuilders.rangeQuery("price").gte(200).lte(300));//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//解析数据SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 bool查询

dsl语句

java代码

java">/*** bool符合查询*/@Testpublic void test06() throws IOException {//构建 查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句//构建boolQuery对象BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.matchQuery("all","上海外滩"));boolQuery.mustNot(QueryBuilders.rangeQuery("price").gte(500));boolQuery.filter(QueryBuilders.geoDistanceQuery("location").distance("100km").point(31,121));request.source().query(boolQuery);//发送请求SearchResponse response = restHighLevelClient.search(request,RequestOptions.DEFAULT);//解析数据SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 算分查询

dsl语句

java代码

java">/*** 算分查询*/@Testpublic void test07() throws IOException {//构建 查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句//定义算分函数FunctionScoreQueryBuilder.FilterFunctionBuilder[] functions = new FunctionScoreQueryBuilder.FilterFunctionBuilder[] {new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("brand","如家"),ScoreFunctionBuilders.weightFactorFunction(10)  // 权重因子,乘以基础得分)};// 创建算分查询QueryBuilders.functionScoreQuery(QueryBuilders.matchQuery("all","上海"),functions).boostMode(CombineFunction.MULTIPLY);//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);//解析数据SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 排序和分页

dsl语句

java代码

java">    /*** 分页和排序*/@Testpublic void test08() throws IOException {//构建查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句request.source().query(QueryBuilders.matchQuery("all","酒店"));// 添加基于地理位置的排序,假设我们根据"location"字段进行排序GeoDistanceSortBuilder geoDistanceSortBuilder = new GeoDistanceSortBuilder("location", 31, 121).order(SortOrder.ASC) // 升序排序.unit(DistanceUnit.KILOMETERS); // 单位为千米request.source().sort(geoDistanceSortBuilder);int page=1,size=5;//es索引从0开始request.source().from((page-1)*size).size(size);//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);docs.add(hotelDoc);}}System.out.println(docs);}

 高亮显示

dsl语句

 java代码

java">/*** 分页和排序,高亮显示*/@Testpublic void test09() throws IOException {//构建查询对象SearchRequest request = new SearchRequest("hotel");//设置dsl语句request.source().query(QueryBuilders.matchQuery("all","酒店"));// 添加基于地理位置的排序,假设我们根据"location"字段进行排序GeoDistanceSortBuilder geoDistanceSortBuilder = new GeoDistanceSortBuilder("location", 31, 121).order(SortOrder.ASC) // 升序排序.unit(DistanceUnit.KILOMETERS); // 单位为千米request.source().sort(geoDistanceSortBuilder);int page=1,size=5;//es索引从0开始request.source().from((page-1)*size).size(size);//设置高量request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));//发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);SearchHit[] hits = response.getHits().getHits();ArrayList<HotelDoc> docs = new ArrayList<>();if(ArrayUtils.isNotEmpty(hits)) {for (SearchHit hit : hits) {String jsonData = hit.getSourceAsString();HotelDoc hotelDoc = JSON.parseObject(jsonData, HotelDoc.class);//获取高亮map集合Map<String, HighlightField> fieldMap = hit.getHighlightFields();if(!CollectionUtils.isEmpty(fieldMap)) {//获取高亮字段name的值HighlightField highlightField = fieldMap.get("name");//获取name数组的第一个值String hightName = highlightField.getFragments()[0].string();//用高亮的值替换原来的值hotelDoc.setName(hightName);}//获取排序的值Object[] sortValues = hit.getSortValues();System.out.println(Arrays.toString(sortValues));docs.add(hotelDoc);}}System.out.println(docs);}


http://www.ppmy.cn/server/133820.html

相关文章

图片写入GPS经纬高信息

近期项目中需要往java平台传输图片&#xff0c;直接使用QNetworkAccessManager和QHttpMultipart类即可&#xff0c;其他博文中有分享。 主要是平台接口对所传输图片有要求&#xff1a;需要包含GPS信息&#xff08;经度、纬度、高度&#xff09;。 Qt无法直接实现&#xff0c;…

数据驱动时代:五款免费报表工具深度解析

在当今数据驱动的时代&#xff0c;报表工具已经成为各类企业进行决策和管理的重要工具。无论是大中型企业还是小微企业&#xff0c;能够快速、高效地生成可视化报表&#xff0c;洞察业务运营情况&#xff0c;已经成为提升竞争力的关键。今天为大家挑选了5款非常优秀的报表软件&…

STM32G4系列MCU的ADC模块标定方法和采样时间

目录 概述 1 ADC模块标定 1.1 功能介绍 1.2 软件程序校准ADC 1.2.1 标定步骤 1.2.2 标定时序框图 1.3 软件程序重新注入校准因子到ADC 1.3.1 标定步骤 1.3.2 更新ADC校准因子 1.4 用单个ADC转换单端和差分模拟输入 1.4.1 标定流程 1.4.2 混合单端和差分通道 2 通道…

WPF中的Style

Style介绍 在XAML中&#xff0c;Style是一个用于定义控件的默认属性值的资源。通过样式&#xff0c;你可以设置一组属性&#xff0c;这些属性将被应用到所有使用该样式的控件上。这有助于保持应用程序的一致性&#xff0c;并且可以减少重复的标记&#xff0c;使得UI的维护更加…

微信小程序canvas 生成二维码图片,画图片,生成图片,将两个canvas结合并保存图片

需求实现步骤如下 先定义两个canvas一个canvas myQrcode画二维码的图片另一个canvas mycanvas画一个背景图&#xff0c;并把二维码画到这个canvas上&#xff0c;mycanvas这个canvas生成一张图片&#xff0c;返回图片的临时路径最后保存图片到手机 首先wxml,新版微信小程序can…

大数据-171 Elasticsearch ES-Head 与 Kibana 配置 使用 测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

1.IDEA开发之子模块无法继承父模块的依赖

目录 1.1 出现的问题 1.2 父模块的Pom.xml配置文件 1.3 子模块的Pom.xml配置文件 1.4 思考&#xff1a;究竟哪里出现了问题&#xff1f; 1.1 出现的问题 在开发Spring引入数据库外部配置文件&#xff0c;发现我开发的父模块Spring以及子模块spring6-ioc-xml出现了无法…

毕业设计选题:基于Hadoop的热点新闻分析系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 新闻类型管理 主题标签管理 热点新闻管理 新闻…