袁庭新ES系列16节|Elasticsearch客户端高级操作

前言

上一章节袁老师主要带领大家学习了Elasticsearch客户端基础部分的内容,Elasticsearch客户端还有很多高级相关的操作,这一章节主要带领大家来学习Elasticsearch客户端高级相关的操作。接下来就跟上袁老师的节奏继续探讨Elasticsearch的相关知识。

一. 搜索数据

1.查询所有match_all

1.先准备一部分数据。通过Kibana向yx索引库中插入以下5条数据。

POST /yx/product/1
{"title": "小米手机Mix","category": "手机","brand": "小米","price": 2899.00,"images": "http://image.yx.com/12479122.jpg"
}POST /yx/product/2
{"title": "坚果手机R1","category": "手机","brand": "锤子","price": 3699.00,"images": "http://image.yx.com/12479122.jpg"
}POST /yx/product/3
{"title": "华为META20","category": "手机","brand": "华为","price": 4499.00,"images": "http://image.yx.com/12479122.jpg"
}POST /yx/product/4
{"title": "小米Pro","category": "手机","brand": "小米","price": 4299.00,"images": "http://image.yx.com/12479122.jpg"
}POST /yx/product/5
{"title": "荣耀V20","category": "手机","brand": "华为","price": 2799.00,"images": "http://image.yx.com/12479122.jpg"
}

2.在ElasticsearchTests类中编写查询所有文档的matchAllQuery()方法。

/** 查询所有数据 */
@Test
public void matchAllQuery() throws IOException {// 创建搜索对象SearchRequest request = new SearchRequest();// 查询构建工具SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加查询条件,通过QueryBuilders获取各种查询sourceBuilder.query(QueryBuilders.matchAllQuery());request.source(sourceBuilder);// 搜索SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 解析SearchHits hits = response.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {// 取出source数据String json = hit.getSourceAsString();// 反序列化Product product = gson.fromJson(json, Product.class);System.err.println(product);}
}

3.运行matchAllQuery()方法,输出结果见下:

Product(id=null, title=坚果手机R1, category=手机, brand=锤子, price=3699.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=小米Pro, category=手机, brand=小米, price=4299.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=荣耀V20, category=手机, brand=华为, price=2799.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=小米手机Mix, category=手机, brand=小米, price=2899.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=华为META20, category=手机, brand=华为, price=4499.0, images=http://image.yx.com/12479122.jpg)

注意,上面的代码中,搜索条件是通过sourceBuilder.query(QueryBuilders.matchAllQuery())来添加的。这个query()方法接受的参数是QueryBuilder接口类型。

这个接口提供了很多实现类,分别对应我们在之前学习的不同类型的查询。例如:term查询、match查询、range查询、boolean查询等。见下图(Mac快捷键:command+option+B):

因此,我们如果要使用各种不同查询,其实仅仅是传递给sourceBuilder.query(QueryBuilder query)方法的参数不同而已。而这些实现类不需要我们去手动创建 ,官方提供了QueryBuilders工厂帮我们构建各种实现类。

2.关键字搜索match

1.在ElasticsearchTests类中定义关键字查询文档数据的matchQuery()方法。

/** 关键字查询数据 */
@Test
public void matchQuery() throws IOException {// 创建搜索对象SearchRequest request = new SearchRequest();// 查询构建工具SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加查询条件,通过QueryBuilders获取各种查询sourceBuilder.query(QueryBuilders.matchQuery("title", "手机"));request.source(sourceBuilder);// 搜索SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 解析SearchHits hits = response.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {// 取出source数据String json = hit.getSourceAsString();// 反序列化Product product = gson.fromJson(json, Product.class);System.err.println(product);}
}

2.运行matchQuery()方法,输出结果见下:

Product(id=null, title=坚果手机R1, category=手机, brand=锤子, price=3699.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=小米手机Mix, category=手机, brand=小米, price=2899.0, images=http://image.yx.com/12479122.jpg)

其实搜索类型的变化,仅仅是利用QueryBuilders构建的查询对象不同而已,其他代码基本一致。因此,我们可以把这段代码封装,然后把查询条件作为参数传递。

3.在ElasticsearchTests类中定义basicQuery()方法封装代码,然后重构matchQuery()方法。

/** 关键字查询数据 */
@Test
public void matchQuery() throws IOException {// 查询构建工具SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加查询条件,通过QueryBuilders获取各种查询sourceBuilder.query(QueryBuilders.matchQuery("title", "手机"));basicQuery(sourceBuilder);/*// 创建搜索对象SearchRequest request = new SearchRequest();// 查询构建工具SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加查询条件,通过QueryBuilders获取各种查询sourceBuilder.query(QueryBuilders.matchQuery("title", "手机"));request.source(sourceBuilder);// 搜索SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 解析SearchHits hits = response.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {// 取出source数据String json = hit.getSourceAsString();// 反序列化Product product = gson.fromJson(json, Product.class);System.err.println(product);}*/}public void basicQuery(SearchSourceBuilder sourceBuilder) throws IOException {// 创建搜索对象SearchRequest request = new SearchRequest();request.source(sourceBuilder);// 搜索SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);// 解析SearchHits hits = response.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {// 取出source数据String json = hit.getSourceAsString();// 反序列化Product product = gson.fromJson(json, Product.class);System.err.println(product);}
}

3.范围查询range

QueryBuilders类中定义返回查询的方法。

RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(String name);

RangeQueryBuilder提供多种范围查询API,常见用的见下:

方法

说明

gt(Object from)

大于

gte(Object from)

大于等于

lt(Object from)

小于

lte(Object from)

小于等于

1.在ElasticsearchTests类中定义范围查询的rangeQuery()方法。

/** 范围查询数据 */
@Test
public void rangeQuery() throws IOException {// 查询构建工具SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加查询条件,通过QueryBuilders获取各种查询sourceBuilder.query(QueryBuilders.rangeQuery("price").gt(3000).lt(5000));basicQuery(sourceBuilder);
}

2.运行rangeQuery()方法,输出结果见下:

Product(id=null, title=坚果手机R1, category=手机, brand=锤子, price=3699.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=小米Pro, category=手机, brand=小米, price=4299.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=华为META20, category=手机, brand=华为, price=4499.0, images=http://image.yx.com/12479122.jpg)

4.source过滤

默认情况下,索引库中所有数据都会返回(_source属性中存储原始文档),如果我们想只返回部分字段,可以通过source filter来控制。

1.在ElasticsearchTests类中定义过滤查询的sourceFilter()方法。

/** 过滤查询数据 */
@Test
public void sourceFilter() throws IOException {// 查询构建工具SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加查询条件,通过QueryBuilders获取各种查询sourceBuilder.query(QueryBuilders.matchAllQuery());// 添加source过滤sourceBuilder.fetchSource(new String[] {"id", "title", "price"}, null);basicQuery(sourceBuilder);
}

2.运行sourceFilter()方法,输出结果见下:

Product(id=null, title=坚果手机R1, category=null, brand=null, price=3699.0, images=null)
Product(id=null, title=小米Pro, category=null, brand=null, price=4299.0, images=null)
Product(id=null, title=荣耀V20, category=null, brand=null, price=2799.0, images=null)
Product(id=null, title=小米手机Mix, category=null, brand=null, price=2899.0, images=null)
Product(id=null, title=华为META20, category=null, brand=null, price=4499.0, images=null)

二. 排序

排序依然是通过SearchSourceBuilder来进行配置。

1.在ElasticsearchTests类中定义过滤查询的sort()方法。

/** 排序查询数据 */
@Test
public void sort() throws IOException {// 创建搜索对象SearchRequest request = new SearchRequest();// 查询构建工具SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加查询条件,通过QueryBuilders获取各种查询sourceBuilder.query(QueryBuilders.matchAllQuery());// 添加排序sourceBuilder.sort("price", SortOrder.DESC);basicQuery(sourceBuilder);
}

2.运行sort()方法,输出结果见下:

Product(id=null, title=华为META20, category=手机, brand=华为, price=4499.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=小米Pro, category=手机, brand=小米, price=4299.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=坚果手机R1, category=手机, brand=锤子, price=3699.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=小米手机Mix, category=手机, brand=小米, price=2899.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=荣耀V20, category=手机, brand=华为, price=2799.0, images=http://image.yx.com/12479122.jpg)

三. 分页

1.分页语法

分页需要视图层传递两个参数给后台。

参数

描述

page

当前页

size

每页大小

而Elasticsearch中需要的不是当前页,而是当前页的起始位置,还好有公式可以计算出。

起始位置:from = (page - 1) * size

2.分页案例

1.在ElasticsearchTests类中定义分页查询的paging()方法。

/** 分页查询数据 */
@Test
public void paging() throws IOException {// 创建搜索对象SearchRequest request = new SearchRequest();// 查询构建工具SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 添加查询条件,通过QueryBuilders获取各种查询sourceBuilder.query(QueryBuilders.matchAllQuery());// 分页查询int page = 1;int size = 3;int from = (page - 1) * size;// 配置分页sourceBuilder.from(from);sourceBuilder.size(size);basicQuery(sourceBuilder);
}

2.运行paging()方法,输出结果见下:

Product(id=null, title=坚果手机R1, category=手机, brand=锤子, price=3699.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=小米Pro, category=手机, brand=小米, price=4299.0, images=http://image.yx.com/12479122.jpg)
Product(id=null, title=荣耀V20, category=手机, brand=华为, price=2799.0, images=http://image.yx.com/12479122.jpg)

四. 结语

Elasticsearch客户端高级操作的内容袁老师就带领大学学习到这里,这一章节主要带领大学学习了:搜索数据,包括查询所有match_all、关键字搜索match、范围查询range和source过滤内容,同时还介绍了排序和分页等操作。好了关于Elasticsearch客户端操作的所有内容我们就学完啦。

今天的内容就分享到这里吧。关注「袁庭新」,干货天天都不断!

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

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

相关文章

Linux常用命令总结(四):文件权限及相关命令介绍

1. 文件属性信息解读 1. 文件类型和权限的表示 0首位表示类型。在Linux中第一个字符代表这个文件是目录、文件或链接文件 符号对应文件类型-代表文件dd 代表目录l链接文档(link file); 1-3位确定属主(该文件的所有者)拥有该文件的权限。 4-6…

深度探讨容器化技术在网络安全中的应用与挑战

随着容器化技术的快速发展,尤其是Docker与Kubernetes(K8s)的广泛应用,企业IT架构正经历着从传统虚拟机向轻量级容器的深刻变革。容器化技术为提升资源利用率、加速应用部署及维护提供了强大支持,但同时也给网络安全带来…

每日一题:托普利茨矩阵

给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。 示例 1: 输入:matrix…

六西格玛管理培训对于个人的职业发展有哪些帮助?

在职业生涯的辽阔天地中,要想展翅高飞,不仅需要坚实的专业根基,还需掌握那些能引领团队、驱动变革的先进管理理念与方法。六西格玛管理作为一种以数据为基础、追求卓越的管理策略,正逐渐成为企业提升竞争力的有力工具,…

关于msvcp140.dll下载的方法分享,怎么才能靠谱的修复msvcp140.dll

msvcp140.dll文件的缺失,就代表你要去它重新下载回来,不然的话你的某些程序是没办法启动的,会直接卡死报错打不开!今天就来教一下大家怎么去把msvcp140.dll下载回来,完成修复! 一.msvcp140.dll文件有什么作…

用java实现PDF的下载

1.下载PDF模版 2.导入依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version><type>pom</type></dependency> 3.完整代码 package com.by.controller…

冯唐成事心法笔记 —— 知智慧

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录PART 4 知智慧 知可为&#xff0c;知不可为大势不可为怎么办为什么人是第一位的多谈问题&#xff0c;少谈道理用金字塔…

面试经典150题——路径总和

​ 1. 题目描述 2. 题目分析与解析 2.1 思路一 注意题目的关键点&#xff1a;判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;起点是root&#xff0c;终点是叶子节点。 那么我们就可以从根节点按照层序遍历的方式&#xff0c;从根节点从根到 叶子不断对路径进行加…

前端H5动态背景登录页面(下)

最近正好有点儿时间&#xff0c;把之前没整理完的前端动态背景登录页面给整理一下&#xff01;这是之前的连接前端H5动态背景登录页面&#xff08;上&#xff09;&#xff0c;这主要是两个登陆页面&#xff0c;一个彩色气泡&#xff0c;一个动态云朵&#xff0c;感兴趣的可以点…

Python程序设计教案

文章目录&#xff1a; 一&#xff1a;软件环境安装 第一个软件&#xff1a;pycharm 第二个软件&#xff1a;thonny 第三个软件&#xff1a;IDIE&#xff08;自带的集成开发环境&#xff09; 二&#xff1a;相关 1.规范 2.关键字 3.Ascll码表 三&#xff1a;语法基础…

【Altium Designer 22原理图,PCB】

Altium Designer 22-原理图&#xff0c;PCB ■ AD22■ 工程■ 工程之外的文件 ■ AD22-画原理图■ 原理图库的设计■ 操作心得■ 元件库来源■ 检查原理图库的正确性并生成报告 ■ 原理图的设计■ 原理图页的大小设置■ 设置栅格100mil■ 放置元器件■ 元件的复制&#xff0c;剪…

从 MySQL 到 ClickHouse 实时数据同步 —— Debezium + Kafka 表引擎

目录 一、总体架构 二、安装配置 MySQL 主从复制 三、安装配置 ClickHouse 集群 四、安装 JDK 五、安装配置 Zookeeper 集群 六、安装配置 Kafaka 集群 七、安装配置 Debezium-Connector-MySQL 插件 1. 创建插件目录 2. 解压文件到插件目录 3. 配置 Kafka Connector …

常见UI设计模式有哪些?从小白到资深必学

通过了解如何以及何时使用&#xff0c;每种 UI 设计模式都有其特定的目的&#xff0c;可以创建一个一致高效的界面。UI 设计模式为用户界面设计者提供了一种通用语言&#xff0c;并为网站和应用程序的用户提供了一致性。本指南&#xff0c;即时设计总结了 UI 设计模式和 UI 设计…

HTTP协议的总结

参考 https://www.runoob.com/http/http-tutorial.html 1.简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模…

美客多、Lazada商家必须知道的养号技巧,助力打造爆款!

在Lazada平台开店&#xff0c;每个商家都渴望打造出自己的爆款产品。爆款不仅能为店铺带来大量流量&#xff0c;还能显著提升店铺和其他产品的转化率。然而&#xff0c;要想成功打造爆款&#xff0c;并非易事&#xff0c;需要掌握一些关键的小技能。 在Lazada平台&#xff0c;商…

每日OJ题_BFS解决拓扑排序③_力扣LCR 114. 火星词典

目录 力扣LCR 114. 火星词典 解析代码 力扣LCR 114. 火星词典 LCR 114. 火星词典 难度 困难 现有一种使用英语字母的外星文语言&#xff0c;这门语言的字母顺序与英语顺序不同。 给定一个字符串列表 words &#xff0c;作为这门语言的词典&#xff0c;words 中的字符串已…

十五、Java中I/O流

1、流的基本概念 1)流的概念 流:在Java中所有的数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质就是数据传输,根据数据传输特性将流抽象为各种类。 (1)按照流向分:输入流、输出流。…

网络靶场实战-物联网安全qiling框架初探

背景 Qiling Framework是一个基于Python的二进制分析、模拟和虚拟化框架。它可以用于动态分析和仿真运行不同操作系统、处理器和体系结构下的二进制文件。除此之外&#xff0c;Qiling框架还提供了易于使用的API和插件系统&#xff0c;方便使用者进行二进制分析和漏洞挖掘等工作…

【求助】西门子S7-200PLC定时中断+数据归档的使用

前言 已经经历了种种磨难来记录我的数据&#xff08;使用过填表程序、触摸屏的历史记录和数据归档&#xff09;之后&#xff0c;具体可以看看这篇文章&#xff1a;&#x1f6aa;西门子S7-200PLC的数据归档怎么用&#xff1f;&#xff0c;出现了新的问题。 问题的提出 最新的…

网工交换基础——生成树协议(01)

一、生成树的技术概述 1、技术背景 二层交换机网络的冗余性导致出现二层环路&#xff1a; 人为因素导致的二层环路问题&#xff1a; 二层环路带来的网络问题&#xff1a; 生成树协议的概念&#xff1a; STP(Spanning Tree Protocol)是生成树协议的英文缩写。该协议可应用于在网…