RestHighLevelClient操作es查询文档

news2024/10/27 18:51:46

目录

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

查询match_all

dsl语句:

​编辑 java代码

小结

 match字段全文检索查询

dsl语句

java代码

 multi_match多字段全文检索查询

dsl语句

 java代码

term精确查询

dsl语句

java代码

range范围查询

dsl语句

java代码

 bool查询

dsl语句

java代码

 算分查询

dsl语句

java代码

 排序和分页

dsl语句

java代码

 高亮显示

dsl语句

​编辑 java代码


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

查询match_all

dsl语句:

 java代码

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

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

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

@SpringBootTest
public class TestSearch {
    @Autowired
    private RestHighLevelClient restHighLevelClient;
    /**
     * 测试全文查询match_all
     */
    @Test
    public 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代码

/**
     * 单字段全文检索查询
     */
    @Test
    public 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代码

    /**
     * 多字段匹配查询
     */
    @Test
    public 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代码

    /**
     * 精确查询
     */
    @Test
    public 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代码

    /**
     * range范围查询
     */
    @Test
    public 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代码

/**
     * bool符合查询
     */
    @Test
    public 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代码

/**
     * 算分查询
     */
    @Test
    public 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代码

    /**
     * 分页和排序
     */
    @Test
    public 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代码

/**
     * 分页和排序,高亮显示
     */
    @Test
    public 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.coloradmin.cn/o/2224857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息学奥赛与其他四大奥赛的区别:深入分析与解读

五大学科奥赛&#xff0c;涵盖了信息学、数学、物理、化学和生物&#xff0c;每一学科竞赛的重点和考查方式都不同。信息学奥赛&#xff08;NOI&#xff09;与其他四科相比&#xff0c;独具编程和算法特性。本文将深入分析信息学奥赛与其他四科竞赛在考查内容、备赛方式、实践要…

《BLEU: a Method for Automatic Evaluation of Machine Translation》翻译

文章目录 0. 摘要1. 引言1.1 理由1.2 观点 2. 基准 BLEU 指标2.1 修正的 n-gram 精度2.1.1 对文本块的修正 n-gram 精度2.1.2 仅使用修正 n-gram 精度对系统进行排序2.1.3 结合修正的 n-gram 精度 2.2 句子长度2.2.1 召回率的问题2.2.2 句子简短惩罚 2.3 BLEU 细节 3. BLEU 评估…

芒果数据集(猫脸码客第230期)

芒果深度学习检测&#xff1a;开启农业新视界 一、引言 芒果作为一种重要的热带水果&#xff0c;在全球范围内具有广泛的市场需求和经济价值。随着人们生活水平的提高&#xff0c;对芒果的品质要求也越来越高。芒果产业的规模不断扩大&#xff0c;产量逐年增加&#xff0c;如…

中间件安全(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞&#xff08;cve_2021_41773&#xff09;。 靶场链接&#xff1a;Vulfocus 漏洞威胁分析平台 一&#xff0c;漏洞简介。 cve_2021_41773漏洞…

【Linux探索学习】第一弹——Linux的常用指令

目录 ​编辑 Linux常用命令 1 Linux命令初体验 1.1 常用命令演示 1). ls 2). pwd 3). cd 4). touch 5). mkdir 6). rm 1.2 Linux命令使用技巧 1.3 Linux命令格式 2 文件目录操作命令 2.1 ls 2.2 cd 2.3 cat 2.4 more 2.5 tail 2.6 mkdir 2.7 rmdir 2.8 rm…

《Windows PE》7.4 资源表应用

本节我们将通过两个示例程序&#xff0c;演示对PE文件内图标资源的置换与提取。 本节必须掌握的知识点&#xff1a; 更改图标 提取图标资源 7.4.1 更改图标 让我们来做一个实验&#xff0c;替换PE文件中现有的图标。如果手工替换&#xff0c;一定是先找到资源表&#xff0c;…

Telephony中ITelephony的AIDL调用关系

以Android14.0源码讲解 ITelephony来自framework下的com.android.internal.telephony包下 frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl这个接口用于与Phone交互的界面&#xff0c;主要由TelephonyManager类使用&#xff0c;一些地方仍在…

开拓鸿蒙测试新境界,龙测科技引领自动化测试未来

在当今科技舞台上&#xff0c;鸿蒙 OS 以非凡先进性强势登场&#xff0c;打破传统操作系统格局&#xff0c;为软件测试领域带来全新机遇与艰巨挑战。 一、鸿蒙 OS 的辉煌崛起 &#xff08;一&#xff09;壮丽发展历程与卓越市场地位 鸿蒙 OS 的发展如波澜壮阔的史诗。2023 年…

音视频开发之旅(98) -潜扩散模型(Latent Diffusion Model)原理及源码解析

目录 1.背景 2. 潜扩散模型&#xff08;Latent Diffusion Model&#xff09;原理 3. 应用场景 4. 推理源码解析 5. 资料 一、背景 前面我们分析扩散模型&#xff08;Diffusion Model&#xff09;了解到&#xff0c;它通过向数据中添加噪声&#xff0c;然后训练一个去噪模…

SSM学习day01 JS基础语法

一、JS基础语法 跟java有点像&#xff0c;但是不用注明数据类型 使用var去声明变量 特点1&#xff1a;var关键字声明变量&#xff0c;是为全局变量&#xff0c;作用域很大。在一个代码块中定义的变量&#xff0c;在其他代码块里也能使用 特点2&#xff1a;可以重复定义&#…

【mysql进阶】4-6. InnoDB 磁盘文件

InnoDB 磁盘⽂件 1 InnoDB存储引擎包含哪些磁盘⽂件&#xff1f; &#x1f50d; 分析过程 ✅ 解答问题 InnoDB的磁盘⽂件主要是表空间⽂件和其他⽂件&#xff0c;表空间包括&#xff1a;系统表空间、独⽴表空间、通⽤表空间、临时表空间和撤销表空间&#xff1b;其他⽂件有重做…

XQT_UI 组件|03 |加载组件 XQtLoading

XQtLoading 使用文档 简介 XQtLoading 是一个自定义的加载动画组件&#xff0c;旨在为用户提供可配置的旋转花瓣动画效果。它可以在应用程序中用于指示加载状态&#xff0c;提升用户体验。 特征 可配置性&#xff1a;用户可以根据需求调整旋转周期、缩放周期、最大/最小缩放…

JavaScript part2

一.前言 前面我们讲了一下js的基础语法&#xff0c;但是这些还是远远不够的&#xff0c;我们要想操作标签&#xff0c;实现一个动态且好看的页面&#xff0c;就得学会BOM和DOM&#xff0c;这些都是浏览器和页面的&#xff0c;这样我们才能实现一个好看的页面 二.BOM对象 BOM…

golang将指针传给cgo后还能被回收吗?

问题&#xff1a; 如果把golang分配的变量&#xff0c;其指针通过cgo传给c&#xff0c;并被c存储&#xff0c;那这个变量还能被gc回收吗&#xff1f; 实验代码&#xff1a; test_memory_leak.go package main/* #include <stdlib.h> #include <string.h> #incl…

yolov11的onnx模型C++ 调用

yolov11的onnx模型C调用 效果图一、python调用二、onnx模型导出三、python的onnx调用调用检测模型调用分割模型 四、C的onnx模型调用五 、视频流的检测后续 效果图 一、python调用 本文只记录生成的yolov11模型如何调用&#xff0c;其他可参考各种yolov11博客 模型下载&#x…

Spring Boot 应用开发全攻略:从入门到精通

Spring Boot 应用开发全攻略&#xff1a;从入门到精通 引言 在当今快速发展的软件开发领域&#xff0c;Spring Boot 作为一种快速开发框架&#xff0c;凭借其简洁、易用的特性&#xff0c;赢得了开发者的广泛青睐。无论是微服务架构还是传统的单体应用&#xff0c;Spring Boo…

Redis 单机、主从、哨兵和集群架构详解和搭建

目录 前言 单机部署 检查安装 gcc 环境 下载安装 Redis 启动 Redis 关闭 Redis 配置Redis 主从部署 整体架构图 主从复制配置 重启 Redis 验证 主从复制的作⽤ 主从复制缺点 哨兵部署&#xff08;Sentinel&#xff09; 整体架构图 哨兵模式配置 启动哨兵 验证…

首席数据官和首席数据分析官

根据分析人士的预测&#xff0c;首席数据官&#xff08;CDO&#xff09;和首席数据分析官&#xff08;CDAO&#xff09;必须更有效地展示他们对企业和AI项目的价值&#xff0c;以保障其在高管层的地位。Gartner的最新报告指出&#xff0c;CDO和CDAO在AI时代需要重新塑造自身定位…

ElegantBook:优美的 LATEX 书籍模板(中文的latex模版)

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 ElegantBook&#xff1a;优美的 LATEX 书籍模板&#xff08;中文的latex模版&#xff09; Github地址&#xff1a;https://github.com/ElegantLaTeX/ElegantBook使用说明文档&#xff1a;https://static.latexs…

C++11实践指北

C11&#xff1a;书、在线工具、库。 书 1. 《现代C语言核心特性解析》 覆盖 C11~C20 特性的讲解。 视频跟读&#xff1a;https://www.bilibili.com/video/BV1nN4y1j7fv 现代CPP随笔_0CCh - 每天5分钟了解现代C新特性 2. 《C Primer》第五版 基于 C11 的 C 入门书。 正在看…