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. 什么是线…

使用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;对数…

如何选择合适的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;其扩容…

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] 输出&…

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

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

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

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

Weblogic 常规渗透测试环境

测试环境 本环境模拟了一个真实的weblogic环境&#xff0c;其后台存在一个弱口令&#xff0c;并且前台存在任意文件读取漏洞。分别通过这两种漏洞&#xff0c;模拟对weblogic场景的渗透。 Weblogic版本&#xff1a;10.3.6(11g) Java版本&#xff1a;1.6 弱口令 环境启动后…

(golang)切片何时会创建新切片或影响原切片

什么时候切片操作会影响原切片 // 1.切片后没有触发slice的扩容机制时 什么时候对切片操作会创建新切片不影响原切片 // 2.对切片头元素进行截取的时候 // 3.当使用append时&#xff0c;len > cap则会触发扩容机制 前置&#xff1a; //slice结构体 type SliceHeader struct…

指针篇章-(4)+qsort函数的模拟

学习目录 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…

​知识图谱:基于嵌入的模型(TransE 、TransH、TransR和TransD)

(一)TransE: Translating Embeddings for Modeling Multi-relational Data. Antoine Bordes, Nicolas Usunier, Alberto Garcia-Duran, Jason Weston, Oksana Yakhnenko. NIPS 2013. 论文地址:http://papers.nips.cc/paper/5071-translating-embeddings-for-modeling-multi-…