1、简单介绍

springboot 使用springdata操作es,ElasticsearchRepository使用QueryBuilder构造查询条件

2、集成es

//maven集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
//实现ElasticsearchRepository
public interface NewsInfoRepository extends ElasticsearchRepository<NewInfoItem,Long> {
}

**3、 查询所有数据matchAllQuery **

matchAllQuery 查询所用:相当于sql中的select * from 。当然,除了使用QueryBuilder,ElasticsearchRepository的findAll方法也是查询所有。

public RestResult queryAll() {
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
List<NewInfoItem> resultList = new ArrayList<>();
Iterable<NewInfoItem> search = this.newsInfoRepository.search(queryBuilder);
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

4、matchQuery字段匹配查询

matchQuery可以简单理解为mysql中的like,因为在elasticsearch中使用matchQuery查询时,他会对查询的field进行分词。当然我们进行查询的这个field的mapping必须是text类型,传给match查询的词条将被建立索引时相同的分析器处理

  public RestResult matchQuery(String title) {
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", title);
//多字段进行匹配
//MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(title, "title", "name");
Iterable<NewInfoItem> search = this.newsInfoRepository.search(matchQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

5、query_string查询

相比其他可用的查询,query_string查询支持全部的Apache Lucene查询语法针对多字段的query_string查询

 public RestResult queryString(String field) {
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery(field);
List<NewInfoItem> resultList = new ArrayList<>();
Iterable<NewInfoItem> search = this.newsInfoRepository.search(queryBuilder);
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

6、通配符查询wildcardQuery

匹配多个字符,?匹配1个字符 避免 开始, 会检索大量内容造成效率缓慢

   public RestResult wildcardQuery(String field) {
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("title", "故事*");
Iterable<NewInfoItem> search = this.newsInfoRepository.search(wildcardQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

7、 词条查询termQuery

词条查询是Elasticsearch中的一个简单查询。它仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条相当于sql语句中的“=”,使用这个搜索一般是对索引中keyword的mapping进行等值搜索。term query 属于过滤器查询,可以处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)。

 public RestResult termQuery(String title) {
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", title);
Iterable<NewInfoItem> search = this.newsInfoRepository.search(termQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

8、查询ID(标识符查询)idsQuery

  public RestResult queryIdsQ(String id) {
//可以添加多个id
IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery().addIds(id);
Iterable<NewInfoItem> search = this.newsInfoRepository.search(idsQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

9、相似度查询fuzzyQuery

fuzzy查询是模糊查询中的第三种类型,它基于编辑距离算法来匹配文档

    public RestResult fuzzyQuery(String str) {
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("title", str);
Iterable<NewInfoItem> search = this.newsInfoRepository.search(fuzzyQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

10、范围查询rangeQuery

范围查询使我们能够找到在某一字段值在某个范围里的文档,字段可以是数值型,也可以是基于字符串的

public RestResult rangeQuery(String str) {
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").from(10).to(20);
//大于:select * from wtyy where age >1
QueryBuilder queryBuilder1 = QueryBuilders.rangeQuery("age").gt(str);
//大于等于:select * from wtyy where age >=1
QueryBuilder queryBuilder2 = QueryBuilders.rangeQuery("age").gte(str);
//小于:select * from wtyy where age <4
QueryBuilder queryBuilder3 = QueryBuilders.rangeQuery("age").lt(str);
//小于等于
QueryBuilder queryBuilder4 = QueryBuilders.rangeQuery("age").lte(str);
Iterable<NewInfoItem> search = this.newsInfoRepository.search(rangeQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

11、 组合查询(复杂查询)

must(QueryBuilders) : AND

mustNot(QueryBuilders): NOT

should(QueryBuilders):OR

public RestResult multiQuery(String title, String stockCode) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("title", title))
.must(QueryBuilders.termQuery("stockCode", stockCode));
Iterable<NewInfoItem> search1 = this.newsInfoRepository.search(boolQueryBuilder);
List<NewInfoItem> resultList = new ArrayList<>();
search1.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

12、复合查询+排序

 public RestResult sortQuery(String title, String stockCode) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("title", title))
.must(QueryBuilders.termQuery("stockCode", stockCode)))
.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC));
Page<NewInfoItem> search = this.newsInfoRepository.search(nativeSearchQueryBuilder.build());
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

13、复合查询+排序+分页

public RestResult pageQuery(String title, String stockCode, Integer pageNum, Integer pageSize) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("title", title))
.must(QueryBuilders.termQuery("stockCode", stockCode)))
.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC))
.withPageable(PageRequest.of(pageNum, pageSize)); Page<NewInfoItem> search = this.newsInfoRepository.search(nativeSearchQueryBuilder.build());
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}

14、复合查询+排序+分页 高亮显示

  public RestResult pageQuery(String title,  Integer pageNum, Integer pageSize) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
String preTag = "<font color='#dd4b39'>";//google的色值
String postTag = "</font>";
nativeSearchQueryBuilder.withQuery(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("title", title)))
.withSort(SortBuilders.fieldSort("id").order(SortOrder.DESC))
.withHighlightFields(new HighlightBuilder.Field("stockCode").preTags(preTag).postTags(postTag))
.withPageable(PageRequest.of(pageNum, pageSize)); Page<NewInfoItem> search = this.newsInfoRepository.search(nativeSearchQueryBuilder.build());
List<NewInfoItem> resultList = new ArrayList<>();
search.forEach(resultList::add);
return interReturnResult(GlobalErrorCode.SUCCESS, resultList);
}



关注我的微信公众号

​​​

ElasticSearch集成SpringData史上最全查询教程的更多相关文章

  1. sentinel (史上最全+入门教程)

    文章很长,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈 为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 < Java 高并发 三部曲 > 面试必备 + 大厂 ...

  2. Redis史上最全文章教程

    Redis 2020 史上最详细Redis教程 本篇文章并不讲解Redis,只是收集 Redis的优质文章教程 ,文章包含三部分: 理论.编程实战 .面试题. 需要有一定编程功底的人学习 ,如果基础不 ...

  3. 如何在VPS上搭建WordPress博客网站(史上最全图文教程)

    由于现在很多人仍然使用共享主机,所以我决定写这篇教程,教你如何设置自己的虚拟专用服务器(VPS),以便为启动一个 WordPress 网站准备好所有必要的服务. 为什么共享托管不是最好的选择? 你的 ...

  4. 史上最全SVN 教程

    以下博文引用<https://blog.csdn.net/u013067756/article/details/73302758>,再此仅供学习和参考. Svn是什么? SVN(全称Sub ...

  5. Redis分布式锁 (图解-秒懂-史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  6. Redis与DB的数据一致性解决方案(史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  7. SpringBoot面试题 (史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  8. 消息队列面试题、RabbitMQ面试题、Kafka面试题、RocketMQ面试题 (史上最全、持续更新、吐血推荐)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  9. Netty 面试题 (史上最全、持续更新)

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

随机推荐

  1. 快速理解VLAN与三层交换机

    一.VLAN 1.1.VLAN的概述与优势 VLAN是逻辑隔离的虚拟局域网,作用是分割广播域(分为物理分割和逻辑分割) VLAN的优势:控制广播.增强网络安全性.简化网络管理 1.2.VLAN的种类 ...

  2. 《微服务架构设计模式》读书笔记 | 第4章 使用Saga管理事务

    目录 前言 1. 微服务架构下的事务管理 1.1 分布式事务的挑战 1.2 一个Saga的示例 1.3 Saga使用补偿事务来回滚所作出的改变 2. Saga的协调模式 2.1 两种Saga协调模式 ...

  3. MySQL-03-基础管理

    用户和权限管理 用户管理 作用:登录,管理数据库逻辑对象 定义:用户名@'白名单' 白名单支持的方式 wordpress@'10.0.0.%' wordpress@'%' wordpress@'10. ...

  4. 001 PCI Express体系结构(一)

    一 .PCI总线的基本知识 PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器.但是PCI总线.系统总线和处理器体系结构之间依然存在着紧 ...

  5. 一文搞懂Java/Spring/Dubbo框架中的SPI机制

    几天前和一位前辈聊起了Spring技术,大佬突然说了SPI,作为一个熟练使用Spring的民工,心中一紧,咱也不敢说不懂,而是在聊完之后赶紧打开了浏览器,开始的学习之路,所以也就有了这篇文章.废话不多 ...

  6. window 右键菜单中添加在vs code 打开

    原文链接: window 右键菜单中添加在vs code 打开 window 右键菜单中添加在vs code 打开 吃码小妖:以前安装VS code可以的,后面不知道为什么不能右键在VS code中打 ...

  7. flutter 常用视图组件

    1.custom class widget main.dart 1 import 'package:flutter/material.dart'; 2 import './pages/custom.d ...

  8. nodejs koa2 设置 静态资源目录

    参考这篇文章:https://blog.csdn.net/qq_38262910/article/details/89147571?utm_medium=distribute.pc_relevant_ ...

  9. 初探Spring Security

    Spring Security 简介 Spring Security是Spring家族中的一个组成框架,具有强大且高度可定制的身份验证和访问控制功能,致力于为Java应用程序提供身份的验证和授权 (先 ...

  10. forEachRemaining

    ArrayList<Integer> arrayList=new ArrayList<>(); for (int i = 0; i <10; i++) { arrayLi ...