Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

📁 前情提要:

Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ①

目录

 一、Springboot 整合 Elasticsearch

1、RestHighLevelClient API介绍

1.1、全查询 & 分页 & 排序

1.2、单条件查询

1.2.1、termQuery

1.2.2、matchQuery

1.2.3、短语检索

1.3、组合查询

1.4、范围查询

1.5、模糊查询

1.6、分组查询


一、Springboot 整合 Elasticsearch

1、RestHighLevelClient API介绍

目前的测试数据有:

1.1、全查询 & 分页 & 排序

    @Testpublic void queryAllDoc() {try {String indexName = "forest";SearchRequest request = new SearchRequest();request.indices(indexName);// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchAllQuery());// 设置分页sourceBuilder.from(1);sourceBuilder.size(3);// 设置排序sourceBuilder.sort("price",  SortOrder.DESC);request.source(sourceBuilder);SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);if (200 != search.status().getStatus()) {log.error("查询失败");}System.out.println("--------查询结果-----------");SearchHits hits = search.getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsString());}} catch (IOException e) {e.printStackTrace();}}

1.2、单条件查询

1.2.1、termQuery

term属于精确匹配,而且只能查单个词(一个汉字或者一个英文单词),不会对用户输入的内容进行分词;

    @Testpublic void queryDocByKey() {try {String indexName = "forest";SearchRequest request = new SearchRequest();request.indices(indexName);// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.termQuery("price", "300"));request.source(sourceBuilder);SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);if (200 != search.status().getStatus()) {log.error("查询失败");}System.out.println("--------查询结果-----------");SearchHits hits = search.getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsString());}} catch (IOException e) {e.printStackTrace();}}

1.2.2、matchQuery

match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配;例如输入“枫树”,match会拆分成“枫”,“树”两个字,只要包含其中一个字的都会被查出来。

    @Testpublic void queryDocByKey() {try {String indexName = "forest";SearchRequest request = new SearchRequest();request.indices(indexName);// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchQuery("title", "枫树"));request.source(sourceBuilder);SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);if (200 != search.status().getStatus()) {log.error("查询失败");}System.out.println("--------查询结果-----------");SearchHits hits = search.getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsString());}} catch (IOException e) {e.printStackTrace();}}

1.2.3、短语检索

要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致

    @Testpublic void queryDocByPhraseKey() {try {String indexName = "forest";SearchRequest request = new SearchRequest();request.indices(indexName);// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.matchPhraseQuery("title", "枫树"));request.source(sourceBuilder);SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);if (200 != search.status().getStatus()) {log.error("查询失败");}System.out.println("--------查询结果-----------");SearchHits hits = search.getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsString());}} catch (IOException e) {e.printStackTrace();}}

1.3、组合查询

  • must:返回的文档必须满足must子句的条件,并且参与计算分值;
  • mustNot:返回的文档必须不满足定义的条件;
  • should:在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回;
  • filter:返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值;
    @Testpublic void queryByCombinationKey() {try {// 声明搜索条件对象String indexName = "forest";SearchRequest request = new SearchRequest();request.indices(indexName);// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.matchQuery("price", 1000));boolQueryBuilder.should(QueryBuilders.matchQuery("id", 3));sourceBuilder.query(boolQueryBuilder);request.source(sourceBuilder);SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);if (200 != search.status().getStatus()) {log.error("查询失败");}System.out.println("--------查询结果-----------");SearchHits hits = search.getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsString());}} catch (IOException e) {e.printStackTrace();}}

[注]当使用should查询时,如果包含了must或者filter查询,那么should的查询语句就不是或者的意思了,而是有或者没有都行的含义。

1.4、范围查询

  • 闭区间查询:QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}).to(${fieldValue2});
  • 开区间查询:QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}, false).to(${fieldValue2}, false);
  • 大于:QueryBuilders.rangeQuery("${fieldName}").gt(${fieldValue});
  • 大于等于:QueryBuilders.rangeQuery("${fieldName}").gte(${fieldValue});
  • 小于:QueryBuilders.rangeQuery("${fieldName}").lt(${fieldValue});
  • 小于等于:QueryBuilders.rangeQuery("${fieldName}").lte(${fieldValue});
 @Testpublic void queryByCombinationKey() {try {// 声明搜索条件对象String indexName = "forest";SearchRequest request = new SearchRequest();request.indices(indexName);// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.rangeQuery("price").from(300).to(500));boolQueryBuilder.must(QueryBuilders.rangeQuery("inventory").from(500).to(1000));sourceBuilder.query(boolQueryBuilder);request.source(sourceBuilder);SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);if (200 != search.status().getStatus()) {log.error("查询失败");}System.out.println("--------查询结果-----------");SearchHits hits = search.getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsString());}} catch (IOException e) {e.printStackTrace();}}

1.5、模糊查询

    @Testpublic void queryFuzzyDocByKey() {try {String indexName = "forest";SearchRequest request = new SearchRequest();request.indices(indexName);// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.fuzzyQuery("title", "松").fuzziness(Fuzziness.AUTO));request.source(sourceBuilder);SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);if (200 != search.status().getStatus()) {log.error("查询失败");}System.out.println("--------查询结果-----------");SearchHits hits = search.getHits();for (SearchHit hit : hits) {System.out.println(hit.getSourceAsString());}} catch (IOException e) {e.printStackTrace();}}

1.6、分组查询

按价格分组后求每组的条数

    @Testpublic void queryGroupByKey() {try {// 声明搜索条件对象String indexName = "forest";SearchRequest request = new SearchRequest();request.indices(indexName);// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.aggregation(AggregationBuilders.terms("price_groupBy").field("price"));request.source(sourceBuilder);SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);if (200 != search.status().getStatus()) {log.error("查询失败");}List<KeyAndCount> list = new ArrayList<>();System.out.println("--------查询结果-----------");Terms terms = search.getAggregations().get("price_groupBy");List<? extends Terms.Bucket> buckets = terms.getBuckets();for (Terms.Bucket bucket : buckets) {KeyAndCount keyAndCount = new KeyAndCount();keyAndCount.setKey(bucket.getKey().toString());keyAndCount.setCount(bucket.getDocCount());list.add(keyAndCount);System.out.println(keyAndCount);}} catch (IOException e) {e.printStackTrace();}}


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

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

相关文章

【linux线程(一)】什么是线程?怎样操作线程?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 什么是线…

使用 Unity 创建 Apple Vision Pro 应用程序和内容的步骤

我们总结了使用 Unity 创建 Apple Vision Pro 应用程序和内容的步骤。 我们总结了使用 visonOS 模拟器检查操作的步骤。 基础知识是按照官方手册进行的,但是有一些部分是我遇到的,所以我附上了很多截图作为备忘录。 参考文章 Unity官方功能页面Unity官方博客Unity官方手册

使用cmd命令运行java

1.普通项目(不带lib文件夹) 1.在桌面上建一个名为com的文件夹&#xff0c;在文件夹中用记事本写两个类文件&#xff0c;后缀改为.java。两个类文件的内容如下图所示&#xff1a; 2.使用javac命令编译主函数&#xff0c;命令行为javac TestMain.java。结果可以看到自动生成了两…

Pygame教程07:键盘常量+键盘事件的2种捕捉方式

------------★Pygame系列教程★------------ Pygame教程01&#xff1a;初识pygame游戏模块 Pygame教程02&#xff1a;图片的加载缩放旋转显示操作 Pygame教程03&#xff1a;文本显示字体加载transform方法 Pygame教程04&#xff1a;draw方法绘制矩形、多边形、圆、椭圆、弧…

理论学习 BatchNorm2d

import torch import torch.nn as nn# With Learnable Parameters m nn.BatchNorm2d(100) # Without Learnable Parameters m nn.BatchNorm2d(100, affineFalse) input torch.randn(20, 100, 35, 45) output m(input)print(output) print(output.shape)这段代码展示了如何使…

2024蓝桥杯每日一题(二分)

一、第一题&#xff1a;教室 解题思路&#xff1a;二分差分 对天数进行二分&#xff0c;在ck函数中用差分方法优化多次区间累加。 【Python程序代码】 n,m map(int,input().split()) a [0] list(map(int,input().split())) d,s,t [0]*(m5),[0]*(m5),[0]*(m5) for…

你还可以通过“nrm”工具,来自由管理“npm”的镜像

你还可以通过“nrm”工具&#xff0c;来自由管理“npm”的镜像 nrm&#xff08;npm registry manager&#xff09;是npm的镜像管理工具&#xff0c;有时候国外的资源太慢&#xff0c;使用这个就可以快速地在npm源间切换。 1.安装nrm 在命令行执行命令&#xff0c;npm install…

Docker容器化技术(数据卷的管理)

数据卷 是一个可供容器使用的特殊目录&#xff0c;它将主机操作系统目录直接 映射进容器&#xff0c;类似于 Linux 中的 mount 行为 。 数据卷&#xff1a;可以提供很多有用的特性 数据卷可以在容器之间共事和重用&#xff0c;容器间传递数据将变得高效与方便&#xff1b;对数…

使用huggingface实现AltCLIP进行对齐语言和图像

目录 引言 使用例子 AltCLIPConfig 参数 示例 AltCLIPTextConfig 参数详解 示例 AltCLIPVisionConfig 参数详解 示例 AltCLIPProcessor 参数 方法 示例使用 AltCLIPModel 前向传播方法 forward 返回值 示例使用 AltCLIPTextModel 方法 forward 返回值 示…

如何选择合适的IP代理,如何为网络爬虫设置代理

目录 前言 1. 代理类型的选择 2. 代理速度 3. 代理稳定性 4. 代理的匿名性 5. 代理的地理位置 总结 前言 在进行网络爬虫任务时&#xff0c;为了避免被目标网站封禁IP或限制访问频率&#xff0c;我们通常会使用代理来隐藏真实的IP地址。选择合适的IP代理对于爬虫的成功…

内部应用解耦神器-Spring事件

大家好&#xff0c;我是程序员牛牛&#xff0c;《AI超级个体: ChatGPT与AIGC实战指南》的参与人&#xff0c;10年Java编程程序员。 1. 概述 在做业务开发过程中&#xff0c;有些复杂点的逻辑&#xff0c;可能代码逻辑会很冗长&#xff0c;举一个很简单的例子&#xff0c;如&am…

【vue.js】文档解读【day 3】 | 条件渲染

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 条件渲染前言&#xff1a;v-ifv-elsev-else-iftemplate中的v-ifv-showv-if vs v-show 条件渲染 前言&#xff1a; 在JavaScript中&#xff0c;我们知道条件控制语句可以控制程序的走向&#…

Failed to fetch dynamically imported module错误解决方案

工作需要&#xff0c;需要搬移某个功能代码到去年的分支&#xff0c;结果报了这个错 花了2个多小时排查&#xff0c;最后发现&#xff0c;是某个ts文件没有搬过来 吐血&#xff0c;怎么不直接提示这个文件不存在呢&#xff0c;让我研究了半天

【JAVA】HashMap扩容性能影响及优化策略

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在软件开发中&#xff0c;HashMap是一种常用的数据结构&#xff0c;但在处理大量数据时&#xff0c;其扩容…

基于支持向量机的的二分类预测

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接:基于支持向量机的的二分类预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88947565 SVM应用实例, 基于…

SpringBoot配置达梦数据库依赖(达梦8)

maven配置 <!-- 达梦数据库 --><dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version></dependency><dependency><groupId>com.alibaba&l…

【力扣 - 最大子数组和】

题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&…

蓝桥杯C++大学B组一个月冲刺记录2024/3/12

蓝桥杯C大学B组一个月冲刺记录2024/3/12 规则&#xff1a;每日三题 时间过得好快… 1.挤牛奶 每天早上 5点&#xff0c;三名农夫去牛场给奶牛们挤奶。 现在从 5点开始按秒计时&#xff0c;第一名农夫在第 300秒开始给牛挤奶&#xff0c;并在第 100 秒停止挤奶。 第二名农夫在第…

自动化测试过程中的手机验证码处理!

手机验证码登录很普遍了&#xff0c;那么在自动化测试的时候需要登录&#xff0c;登录不了就意味着很多自动化就没法执行下去了。 到底该怎么处理呢&#xff1f;其实并不难&#xff0c;我们先看下验证码的业务逻辑&#xff0c;在我们“点击获取验证码”按钮的时候&#xff0c;…

一学就懂:安装OLED透明屏拼接屏需要注意什么?

安装OLED透明屏拼接屏时&#xff0c;需要注意以下几个方面&#xff1a; 一、前期准备 测量和规划&#xff1a;对安装区域进行详细测量&#xff0c;确保安装区域的尺寸和结构符合OLED透明屏的要求。同时&#xff0c;规划好拼接屏的数量、位置以及布线和固定方案。 环境评估&am…