elasticsearch查询操作(API方式)

说明:elasticsearch查询操作除了使用DSL语句的方式(参考:http://t.csdn.cn/k7IGL),也可以使用API的方式。

准备

使用前需先导入依赖

	<!--RestHighLevelClient依赖-->
	<dependency>
	    <groupId>org.elasticsearch.client</groupId>
	    <artifactId>elasticsearch-rest-high-level-client</artifactId>
	</dependency>

创建一个测试类,查询操作代码都写在测试类里面,首先先建立RestHighLevelClient的连接

    /**
     * 定义连接
     */
    private RestHighLevelClient client;

    /**
     * 初始化客户端
     */
    @BeforeEach
    public void init(){
        client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://服务器IP地址:9200")));
    }

    /**
     * 关闭客户端
     * @throws IOException
     */
    @AfterEach
    public void close() throws IOException {
        client.close();
    }

1、模糊查询

(1)全部查询;

查询student索引库的所有文档;

    /**
     * 1.1 全部查询
     * @throws IOException
     */
    @Test
    public void queryMatchAll() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().equals(QueryBuilders.matchAllQuery());

        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        SearchHits hits = response.getHits();

        // 遍历his
        for (SearchHit hit : hits) {

            // 获取字符串
            String json = hit.getSourceAsString();

            // 解析字符串成对象
            StudentDoc studentDoc = JSON.parseObject(json, StudentDoc.class);

            // 打印
            System.out.println("studentDoc = " + studentDoc);
    }

可以看到,API方式的全查默认还是值返回前10条;

在这里插入图片描述

把解析返回值的代码抽取出来成一个方法,方便后面使用

    /**
     * 解析返回值并打印
     * @param response
     */
    private void parseJson(SearchResponse response) {
        // 获取his数据
        SearchHits hits = response.getHits();

        // 遍历his
        for (SearchHit hit : hits) {

            // 获取字符串
            String json = hit.getSourceAsString();

            // 解析字符串成对象
            StudentDoc studentDoc = JSON.parseObject(json, StudentDoc.class);

            // 打印
            System.out.println("studentDoc = " + studentDoc);
        }
    }

(2)单字段查询;

例如,查询all字段值为马尔克斯的文档;

    /**
     * 1.2 单字段查询
     * @throws IOException
     */
    @Test
    public void queryMatch() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.matchQuery("all","马尔克斯"));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

代码执行完成,查询成功;

在这里插入图片描述

(3)多字段查询;

例如,查询name、username和gender字段值包括“陀”的文档;

	/**
     * 1.3 多字段查询
     * @throws IOException
     */
    @Test
    public void multiMatchQuery() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.创建DSL语句
        request.source().query(QueryBuilders.multiMatchQuery("陀","name","username","gender"));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

代码执行完成,查询成功;

在这里插入图片描述

2、精确查询

(1)term查询;

例如,查询name值为杜甫的文档;

	/**
     * 2.1 term查询
     * @throws IOException
     */
    @Test
    public void termQuery() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.创建DSL语句
        request.source().query(QueryBuilders.termQuery("name","杜甫"));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

查询完成;

在这里插入图片描述

(2)range查询;

例如,查询job大于1,小于等于3的文档;

    /**
     *  2.2 range查询
     * @throws IOException
     */
    @Test
    public void rangeQuery() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.rangeQuery("job").gt(1).lte(3));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

查询完成;

在这里插入图片描述

3、复合查询

例如,查询all字段为萨特,并且job≥2,≤4的文档;

	/**
     * 3. 复合查询
     * @throws IOException
     */
    @Test
    public void booleanQuery() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.boolQuery()
                .must(QueryBuilders.matchQuery("all","萨特"))
                .filter(QueryBuilders.rangeQuery("job").gte(2).lte(4)));

        // 3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 4.解析返回值,并打印
        parseJson(search);
    }

查询完成,因为萨特的job=1,所以未查询出来;

在这里插入图片描述

更换job条件为≥1,再查询,可以查询出来;

在这里插入图片描述

4、分页、排序查询

例如,查询job≥1,≤4,按照job降序排序,并且从第2条文档开始,往后取8条;

/**
     * 4. 分页、排序查询
     * @throws IOException
     */
    @Test
    public void queryByPageAndSort() throws IOException {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.rangeQuery("job").gte(1).lte(4));

        // 3.分页查询,查询从第2条开始,往后8条
        request.source().from(2).size(8);

        // 4.排序
        request.source().sort("job", SortOrder.DESC);

        // 5.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 6.解析返回值,并打印
        parseJson(search);
    }

全部符合条件的记录;

在这里插入图片描述

分页、排序查询后,可以看到只有当前页的内容,并且job按照升序排序;

在这里插入图片描述

从结果可以看出,from()中的索引是从0开始的,from(2)表示从第三条开始计算;

5、高亮查询

例如,把name等于关羽的文档,name字段的值设置为斜体(em);

    /**
     * 6.高亮显示
     */
    @Test
    public void heightLight() throws Exception {
        // 1.创建请求
        SearchRequest request = new SearchRequest("student");

        // 2.编写DSL语句
        request.source().query(QueryBuilders.matchQuery("name","关羽"));

        // 3.声明高亮显示
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));

        // 4.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);

        // 5.解析返回值
        SearchHits hits = search.getHits();

        // 6.遍历his
        for (SearchHit hit : hits) {

            // 7.获取字符串
            String json = hit.getSourceAsString();

            // 8.解析字符串成对象
            StudentDoc studentDoc = JSON.parseObject(json, StudentDoc.class);

            // 9.获取高亮字段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();

            // 10.判断高亮字段不能为空
            if (!CollectionUtils.isEmpty(highlightFields)) {

                // 11.获取高亮字段值
                HighlightField highlightField = highlightFields.get("name");

                // 12.判断高亮字段值不等于空
                if (highlightField != null){

                    // 13.获取高亮字段值
                    String heightFightName = highlightField.getFragments()[0].string();

                    // 14.将高亮字段值重新赋值给对象并打印
                    studentDoc.setName(heightFightName);
                    
                    System.out.println("studentDoc = " + studentDoc);
                }
            }
        }
    }

执行代码,可以看到关羽的name字段值被em标签包裹;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/46306.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

内存泄漏是什么?有什么危害

内存泄漏是什么&#xff1f;有什么危害 1. 前言1.内存泄漏是什么&#xff1f;2. 为什么会发生内存泄漏3. 内存泄漏的危害4. 总结 1. 前言 在各种项目开发中&#xff0c;内存泄漏是一个很严重的问题。对资源管理、性能优越、系统稳定性&#xff0c;以及是否安全产生极大印象。本…

AndroidStudio设计一个计算器

界面设计 activity_calcuator.xml 设计&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto&qu…

2、基于redis实现分布式锁

目录 2.1. 基本实现2.2. 防死锁2.3. 防误删2.4. redis中的lua脚本2.4.1 redis 并不能保证2.4.2 lua介绍 2.5. 使用lua保证删除原子性 2.1. 基本实现 借助于redis中的命令setnx(key, value)&#xff0c;key不存在就新增&#xff0c;存在就什么都不做。同时有多个客户端发送setn…

Easy-Es笔记

一、Easy-ES概述 Easy-Es&#xff08;简称EE&#xff09;是一款由国内开发者打造并完全开源的ElasticSearch-ORM框架。在原生 RestHighLevelClient 的基础上&#xff0c;只做增强不做改变&#xff0c;为简化开发、提高效率而生。Easy-Es采用和MP一致的语法设计&#xff0c;降低…

HDFS异构存储详解

异构存储 HDFS异构存储类型什么是异构存储异构存储类型如何让HDFS知道集群中的数据存储目录是那种类型存储介质 块存储选择策略选择策略说明选择策略的命令 案例&#xff1a;冷热温数据异构存储对应步骤 HDFS内存存储策略支持-- LAZY PERSIST介绍执行使用 HDFS异构存储类型 冷…

C# winform子窗口向父窗口传值

这里我使用一个简单的方法。只需要在父窗口定义一个静态变量就行。 父窗体为Form1,子窗体为Form2。 public static int get_num0; 子窗体直接给get_num赋值即可。 Form1.get_num2; 这样父窗体就能获得get_num修改后这个值了

[start] m40 test

software & update 470 drive version # cd /etc/apt # mv sources.list sources.list.bak # sudo vi /etc/apt/sources.list # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ja…

Flask 笔记

Flask 笔记 一、Flask介绍 1、学习Flask框架的原因 2020 Python 开发者调查结果显示Flask和Django是Python Web开发使用的最主要的两个框架。 2、Flask介绍 ​ Flask诞生于2010年&#xff0c;是Armin ronacher用Python 语言基于Werkzeug工具箱编写的轻量级Web开发框架。 ​…

Matlab 点云平面特征提取

文章目录 一、简介二、实现代码2.1基于k个邻近点2.2基于邻近半径参考资料一、简介 点云中存在这各种各样的几何特征,这里基于每个点的邻域协方差来获取该点的所具有的基础几何特征(如下图所示),这样的做法虽然不能很好的提取出点云中的各个部分,但却是可以作为一种数据预处…

SAP ABAP 用户状态锁定案例

一、前言 项目需求是根据当天及前两天的离职员工信息&#xff08;假设这是一个定时器任务每天下午5点执行程序&#xff0c;计算前两天的员工工号是为了将5点之后办理离职的员工工号找出来&#xff09;&#xff0c;将这些员工在用户表 USR02 中的锁定状态设置为 “64”&#xff…

Emacs之实现鼠标/键盘选中即拷贝外界内容(一百二十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

springboot整合ELK+kafka采集日志

一、背景介绍 在分布式的项目中&#xff0c;各功能模块产生的日志比较分散&#xff0c;同时为满足性能要求&#xff0c;同一个微服务会集群化部署&#xff0c;当某一次业务报错后&#xff0c;如果不能确定产生的节点&#xff0c;那么只能逐个节点去查看日志文件&#xff1b;lo…

SecureCRT如何将复制的内容粘贴到word中仍然保持原有字体颜色

SecureCRT如何将复制的内容粘贴到word中仍然保持原有字体颜色 QQ 109792317 说明&#xff1a;当SecureCRT加载了配色文件后&#xff0c;输出的关键字会被不同颜色高亮显示&#xff0c;但是如果复制粘贴到word中会发现成了纯文本&#xff0c;字体颜色消失了。 如何保留 &#x…

2.java语法

文章目录 2.1. 字符型常量和字符串常量的区别?2.2. 关于注释&#xff1f;2.3. 标识符和关键字的区别是什么&#xff1f;2.4. Java 中有哪些常见的关键字&#xff1f; 2.5. 自增自减运算符2.6. continue、break、和 return 的区别是什么&#xff1f; 2.1. 字符型常量和字符串常…

CCLINK转profinet与西门子PLC通讯

用三菱PLC的控制系统需要和西门子的PLC控制系统交互数据&#xff0c;捷米JM-PN-CCLK 是自主研发的一款 PROFINET 从站功能的通讯网关。该产品主要功能是将各种 CCLINK 总线和 PROFINET 网络连接起来。 捷米JM-PN-CCLK总线中做为从站使用&#xff0c;连接到 CCLINK 总线中做为…

商品分类新建,修改,删除。手机扫码开单打印进销存,商贸批发生产企业仓库条码管理软件系统

商品分类新建&#xff0c;手机扫码开单打印进销存&#xff0c;商贸批发生产企业仓库条码管理软件系统&#xff0c;超市便利店五金茶叶烟酒鞋帽门店零售手机收银管理软件APP_哔哩哔哩_bilibili本期视频讲解&#xff1a;商品分类新建, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚…

【VCS】(7)Fast Gate-level Verification

Fast Gate-level Verification VCS中SDF反标(Back-Annotation)Lab 门级网表的后仿真DC综合RTL级仿真波形后仿真 网表级的仿真可以验证综合后得到的门级网表和RTL代码是否一致。也可以验证&#xff0c;在加速时序信息&#xff08;SDF&#xff09;之后&#xff0c;设计的功能是否…

数字化采购平台:提升效率、降低成本的未来趋势

随着信息技术的不断发展和应用&#xff0c;数字化采购平台逐渐成为企业采购管理的未来趋势。数字化采购平台是指通过信息化技术在采购过程中实现数字化、自动化和智能化的管理平台。本文将围绕数字化采购平台的应用和优势&#xff0c;探讨其在提升效率、降低成本等方面的重要作…

Jenkins中sh函数的用法

在Jenkins的Pipeline中&#xff0c;sh函数的用法 用法一 单个命令字符串包括使用&#xff0c;示例如下&#xff1a; sh echo "Hello, Jenkins!"用法二 多个命令字符串包括命令列表使用&#xff0c;示例如下&#xff1a; sh echo "Step 1" echo "…
最新文章