袁庭新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客户端操作的所有内容我们就学完啦。

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

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

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

相关文章

swiper使用方法?

组件 首先 recat -vant组件 带小点点的 可以实现跳转的一个效果 import { Swiper } from react-vant; 每个 Swiper.Item 代表一张轮播卡片,可以通过 autoplay 属性设置自动轮播的间隔。 import React from react; import { Swiper } from react-vant; import { i…

游戏新手村20:游戏落地页广告页如何设计

在互联网营销中,着陆页(Landing Page,有时被称为首要捕获用户页)就是当潜在用户点击广告或者搜索引擎搜索结果页后显示给用户的网页,LandingPage对于游戏广告的转化率和重要性就不言而喻了。 网页游戏LP页面 上图就是我们大家在浏览网站时不小心蹦出或者主动点击某…

数据结构(八)——排序

八、排序 8.1 排序的基本概念 排序(Sort),就是重新排列表中的元素,使表少的元素满足按关键字有序的过程。 输入∶n个记录R1,R2...., Rn,对应的关键字为k1, k2,... , kn 输出:输入序列的一个重排R1,R2....,Rn,使得有k1≤k2≤...≤…

快速入门Web开发(下)

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 有没出现的图片 请访问 传送门 这是我的掘金账号 掘金文…

【MySQL】查询数据,对结果进行排序(关键字:ORDER BY)

文章目录 单列排序多列排序指定排序方式,升序(ASC,ASCENDING) / 降序(DESC,DESCENDING)ORDER BY 关键字与 LIMIT 关键字联用 我是一名立志把细节都说清楚的博主,欢迎【关注】&#x…

Vue项目中引入高德地图步骤详解,附示例代码

vue中如何使用高德地图,下面为您详解。 步骤一:安装高德地图的JavaScript API 在Vue项目的根目录下打开终端,执行以下命令安装高德地图的JavaScript API: npm install amap/amap-jsapi-loader --save 步骤二:创建地…

【数据结构6--图】

目录 1 图2 图的定义和基本概念(在简单图范围内)3 图的类型定义4 图的存储结构4.1 邻接矩阵 表示法4.2 邻接表 表示法4.3 十字链表 表示法4.4 邻接多重表 表示法 5 图的遍历5.1 深度优先搜索-DFS 及 广度优先遍历-BFS 6 图的应用6.1 最小生成树6.1.1 克鲁…

2726641 - Failed to resolve Object Based Navigation target

服务和支持/知识库文章和注释/人事管理/人员发展/目标设置和评估 (PA-PD-PM) 2726641 - 未能解析基于对象的导航目标 SAP Knowledge Base Article, Version: 1, 审批日期: 30.11.2018 组件PA-PD-PM对象状态 优先级正常对象状态 类别问题对象状态 审批状态已发布至客户对象…

Window + Ubuntu 双系统无Ubuntu Bios 启动项

文章目录 安装硬盘位置不重要!!!(但是我安装在了第二张HDD)问题是多盘分位置会导致磁盘主分区变成了简单卷 Bios Ubuntu 启动项修复参考Ubuntu安装U盘进入Try Ubuntu 使用Terminal修复完提示Disable Secure Boot进入Te…

minikube 环境搭建

minikube安装 # 查看linux 架构模式x86_64、arm64 uname -m # Intel x86_64 curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64# Apple arm64 curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/min…

利用ENVI SPEAR工具和WV-2卫星影像数据量测水深

ENVI的SPEAR工具集((Spectral Processing Exploitation and Analysis Resource))是将很多的遥感图像处理过程集成为流程化的操作方式,使得遥感图像处理知识相对薄弱的非专业人员也能利用流程化的工具进行图像处理,图像处理速度也有…

虚拟DOM

虚拟DOM(Virtual DOM)是现代前端框架(如React、Vue等)用于优化DOM操作性能的关键技术。Vue也采用了虚拟DOM来提高性能和提供更好的开发体验。以下是虚拟DOM在Vue中的详细解释: 什么是虚拟DOM? 虚拟DOM是一…

【经典算法】LeetCode104二叉树的最大深度(Java/C/Python3实现含注释说明,Easy)

目录 题目描述思路及实现方式一:递归思路代码实现Java版本C语言版本Python3版本Go语言版本 复杂度分析 方式二:广度优先搜索(BFS)思路代码实现Java版本C语言版本Python3版本 复杂度分析 总结相似题目 标签(题目类型):树、深度优先搜索(DFS)、…

使用iar embedded workbench编译器打开CC2640R2代码工程

使用iar embedded workbench编译器打开CC2640R2代码工程 首先安装CC2640R2的SDK包 目前使用的SDK版本是 simplelink_cc2640r2_sdk_4_20_00_04 在德州仪器(TI)官网下载 https://www.ti.com.cn/product/cn/CC2640R2F-Q1 下载后需要对SDK进行安装,安装很方便&#…

Java中的Set集合和Hash值和TreeSet的使用

Set集合的特点 不包含重复元素的集合 没有带索引的方法,所以不能使用普通for循环遍历 HashSet对集合的迭代顺序不作任何保证 Set集合的遍历 有两种方式遍历一种是迭代器一种是增强for package dayhou40.day49; ​ import java.util.HashSet; import java.util…

C语言程序设计基础(跟知乎学)

1、C语言是一种结构化程序设计语言。三种基本结构:顺序、选择、循环。 2、在C语言中,程序的模块化是利用函数实现的。 3、计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机…

C++ | Leetcode C++题解之第51题N皇后

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> solveNQueens(int n) {auto solutions vector<vector<string>>();auto queens vector<int>(n, -1);auto columns unordered_set<int>();auto diag…

Error: The project seems to require yarn but it‘s not installed.

在使用yarn serve启动vue2项目是发生报错信息 报错信息&#xff1a; 解决方法&#xff1a; 1、 红色箭头行&#xff0c;ctrl单击 进入env.js文件 2、注释行 if (result && !exports.hasYarn()) throw new Error(The project seems to require yarn but its not ins…

Oracle VM virtual Box 安装虚拟机并网络连接宿主机且能ping通外网

新建虚拟机 参考镜像下载连接&#xff1a;支持centos7.8及其以上版本&#xff1a;​ ​http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iosOracle VM virtual Box新建虚拟机&#xff0c;按照下图所示新建虚拟机&#xff1a; 1.新建虚拟机 2.配…

IDEA安装插件Apipost方便调试

进入IDEA的File->sttings->plugins 进入搜索Apipost即可安装插件 使用小箭头即可得到URL&#xff0c;点击进入操作即可