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

devtools/2024/11/7 5:29:17/

前言

上一章节袁老师主要带领大家学习了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.ppmy.cn/devtools/15579.html

相关文章

uniapp自定义轮播图指示点样式实现完整代码附效果图

效果图&#xff1a; 实现代码&#xff1a; <view class"card card_b"><swiper :autoplay"true" interval"3000" duration"500" :current"swiperCurrent" change"swiperChange"class"swiper" :…

角色扮演:项目管理软件中角色的定义与创造性构建

无论是项目经理还是业务成员都会担心项目管理软件的数据安全问题。什么是项目管理软件角色&#xff0c;如何创建项目管理软件角色&#xff1f;在项目管理软件中角色是管理项目团队内部权限的功能。 一、什么是项目管理软件角色 项目管理软件角色在项目管理软件中是定义和区分不…

6547网新增信息素养大赛真题及白名单考级真题

打扰大家了&#xff0c;汇报一下最近的更新动态&#xff0c;如果大家有急切需要的白名单真题及试卷留言&#xff0c;我们会优先更新&#xff01; 6547网文库&#xff08;www.6547.cn/wenku&#xff09;&#xff1a;新增信息素养大赛图形化编程真题及Python真题&#xff0c;2024…

sql注入漏洞语句原型及闭合方法

首先,创建测试库,表,准备好测试数据 1.建库 create database test; show databases; use test;2.建表 personal_info(人员信息表)&#xff0c;admin(假设为网站管理表,里面存的是网站后台管理员的账号密码) create table if not exists personal_info( id int unsigned not …

【Leetcode】705- 设计哈希集合

问题描述 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&#xff09;。 实现 MyHashSet 类&#xff1a; void add(key) 向哈希集合中插入值 key 。 bool contains(key) 返回哈希集合中是否存在这个值 key 。 void remove(key) 将给定值 key 从哈希集合中删除…

Flutter开发好用插件url_launcher详解-启动 URL

文章目录 url_launcher介绍安装用法错误处理自定义行为其他功能 url_launcher介绍 url_launcher 是一个 Flutter 插件&#xff0c;用于启动 URL。它支持网络、电话、短信和电子邮件方案。您可以使用它从您的 Flutter 应用程序中打开网站、拨打号码、发送短信或撰写电子邮件。 …

【virtuoso】 PDK

什么是PDK&#xff1f; PDK( Process Design Kit )&#xff0c;工程设计数据包&#xff0c;是芯片厂家foundary提供给IC设计公司的有关制造工艺的模型和EDA工具支持。是连接IC制造公司&#xff0c;IC设计公司的桥梁。 PDK包含内容&#xff1a; 器件模型 SPICE模型模型 与 测量误…

Python Flask Web教程:make_response的详细用法

在 Flask 中,make_response 是一个非常实用的函数,它可以用来构造响应对象。下面是 make_response 函数的详细用法: 基本用法 在 Flask 中,make_response 可以用来从返回的数据中创建一个响应对象。它接受几种不同类型的参数,并返回一个 Response 对象。 from flask im…