elasticsearch查询操作(API方式)

news2024/11/19 1:30:15

说明: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.coloradmin.cn/o/791324.html

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

相关文章

GitHub发布Copilot Chat公测版,助力开发者编写代码

近日微软GitHub推出了Copilot Chat 的公开测试版&#xff0c;而这个版本不仅仅局限于“代码缺省补充”与“代码纠错”&#xff0c;还能直接基于上文&#xff0c;自动联想出后文。 据了解&#xff0c;该AI工具主要用来助力开发者编写代码&#xff0c;可直接集成到开发者的桌面 …

如何将ubuntu LTS升级为Pro

LTS支持周期是5年&#xff1b; Pro支持周期是10年。 Ubuntu Pro专业版笔记 步骤&#xff1a; 打开“软件和更新” 可以看到最右侧的标签是Ubuntu Pro。 在没有升级之前&#xff0c;如果使用下面两步&#xff1a; sudo apt updatesudo apt upgrade 出现如下提示&#xff…

Zabbix邮件报警(163网易邮箱)

目录 一、电脑登录网易邮箱配置 二、Server端安装配置邮件服务器 邮箱查看 三、编辑zabbix_server.conf 引用邮件脚本 查看邮件 五、配置zabbix web监控项邮件报警 操作思路 Server.zabbix.com web操作 确认报警媒介信息 配置zabbix中的用户所使用的报警媒介类型以及接收邮…

AI绘画StableDiffusion实操教程:月光下的美人(含高清图片)

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 今天继续分享AI绘画实操教程&#xff0c;如何用lora包生成超真实好看质感超强的人物图片。 放大高清图已放到教程包内&#xff0c;需要的可以自取。 出图效果&#xff1a; 更多图片资源访问查看&#xff1a; 教程整合资源…

【代码随想录day20】合并二叉树

题目 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重叠…

Redis在云服务器上的安装与客户端连接配置

文章目录 Redis1.Redis的安装2.设置远程连接3.客户端连接3.1 客户端下载 Redis 1.Redis的安装 yum 安装 redis&#xff0c;使用以下命令&#xff0c;直接将 redis 安装到 linux 服务器&#xff1a; yum -y install redis 启动 redis使用以下命令&#xff0c;以后台运行方式启…

面试之CurrentHashMap的底层原理

首先回答HashMap的底层原理? HashMap是数组链表组成。数字组是HashMap的主体&#xff0c;链表则是主要为了解决哈希冲突而存在的。要将key 存储到&#xff08;put&#xff09;HashMap中&#xff0c;key类型实现必须计算hashcode方法&#xff0c;默认这个方法是对象的地址。接…

git账号修改密码后命令不能拉取代码,报错无权限

解决办法&#xff1a; 1.git命令 查看账号密码&#xff0c;修改密码&#xff0c;如下图 2.设置window git 凭证 3. 完成 &#xff0c;git命令拉去代码成功

九五从零开始的运维之路(其二十五)

文章目录 前言一、概述二、配置环境及搭建服务1.关闭防火墙、网络图形化工具及SElinux2.配置yum源3.测试网络连通性4.分配磁盘容量5.安装targetcli包6.服务器端进行配置7.客户端 总结 前言 本篇将简述的内容&#xff1a;Linux系统下的ISCSI服务 一、概述 iscsi全称&#xff1…

Spring Boot实践一

一、Spring Boot简介 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、方便的方式来创建基于Spring的应用程序&#xff0c;而无需繁琐的配置。Spring Boot通过自动配置和约定大于配置的方式&#xff0c;使得开发者可以更加专注于业务逻辑的实现&…

电容笔和触控笔两者有哪些区别?比较好用的电容笔

与最初推出的那些触控笔相比&#xff0c;目前的电容笔更具有一些独特的特性&#xff0c;比如可以防止手在屏幕上误触&#xff0c;以及可以随意调节线条粗细。苹果的原装Pencil的价格目前也非常昂贵。因此&#xff0c;如果你没有足够的预算&#xff0c;那么你最好选择一支平替电…

装修行业专用装修设计施工团队工地进度小程序开发

互联网高速发展带来的就是大家越来越依赖互联网&#xff0c;从衣食住行都在向互联网整合​。传统的装修行业借助互联网也诞生了新的营销引流​方法。 以前装修房子大家都会参考邻居、朋友、亲戚&#xff0c;但现在不同了&#xff0c;互联网帮助很多人在线上了解装修公司、装修…

探讨ChatGPT的强化学习:AI学习与交互的未来

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Vue3学习组合式API(二)

1、计算属性compute <script setup> //导入 import {ref, computed } from vue const state ref(0) //原始数据 const count ref(1); //计算属性 const doubleCount computed(()>count.value*2);//原始数据 const list ref([1,2,3,4,5,6,7,8]); //list属性值 con…

【Linux】详解线程控制 -- 线程用法 | 线程等待 | 线程ID及地址空间布局

OS提供的轻量级进程接口POSIX线程库 线程使用1.如何创建一堆线程2.线程如何终止3.线程如何取消 线程等待线程退出返回值C11的多线程线程ID及地址空间布局线程地址空间布局线程局部存储 分离线程 OS提供的轻量级进程接口 (关于 用户 → 库 → OS :具体可看下面线程地址空间布局)…

好用亦免费的系统镜像备份软件!

​Windows系统现状 Windows系统备份的重要性日益凸显。随着Windows 7退出历史舞台,Windows 11/10的使用率快速上升。新电脑不再支持Windows 7,许多用户只能转向更新系统。加之Windows 11功能趋于成熟稳定,越来越多人开始适应并接受它。 因此,选择一个适合Windo…

马上做还是等一下?

马上做还是等一下&#xff1f;这是一个产品人经常会遇到的问题。今天想跟大家分享的是面临这两个选择的两个场景和一些感悟。 图1 - 我们总会遇到各种各样的问题&#xff0c;难以抉择 场景一&#xff1a;当你接到一项工作时&#xff0c;会选择高效执行马上开始&#xff0c;还是…

前端图标解决方案

1. 前言 随着 Web 技术的发展与日益丰富的界面需求&#xff0c;图标逐渐成为前端开发中不可或缺的一部分&#xff0c;为此也诞生了各种各样的解决方案。文章总结及分析了目前常见的一些图标解决方案。 2. CSS 背景图片 2.1 background-image 图标本质上也是图片&#xff0c…

子网划分和计网解题方法

子网的基本概念 子网是计算机网络中的一个逻辑单元&#xff0c;是由多个IP地址组成的网络。在计算机网络中&#xff0c;IP地址是一个32位的二进制数&#xff0c;用于标识网络上的设备。子网划分是将一个大型的IP地址网络划分为多个小的IP地址网络&#xff0c;每个小的IP地址网…

软件外包开发的项目管理工具

在开发大型项目时涉及到多人管理&#xff0c;细节比较多&#xff0c;需要借助科学的项目管理方法和软件工具来提高软件项目效率。现在有比较多的项目管理方法和配套工具&#xff0c;每个项目和团队的情况不同&#xff0c;选择适合自己的是最重要的。今天和大家分享软件项目管理…