ElasticSearch集成SpringData史上最全查询教程
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史上最全查询教程的更多相关文章
- sentinel (史上最全+入门教程)
文章很长,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈 为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 < Java 高并发 三部曲 > 面试必备 + 大厂 ...
- Redis史上最全文章教程
Redis 2020 史上最详细Redis教程 本篇文章并不讲解Redis,只是收集 Redis的优质文章教程 ,文章包含三部分: 理论.编程实战 .面试题. 需要有一定编程功底的人学习 ,如果基础不 ...
- 如何在VPS上搭建WordPress博客网站(史上最全图文教程)
由于现在很多人仍然使用共享主机,所以我决定写这篇教程,教你如何设置自己的虚拟专用服务器(VPS),以便为启动一个 WordPress 网站准备好所有必要的服务. 为什么共享托管不是最好的选择? 你的 ...
- 史上最全SVN 教程
以下博文引用<https://blog.csdn.net/u013067756/article/details/73302758>,再此仅供学习和参考. Svn是什么? SVN(全称Sub ...
- Redis分布式锁 (图解-秒懂-史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- Redis与DB的数据一致性解决方案(史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- SpringBoot面试题 (史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- 消息队列面试题、RabbitMQ面试题、Kafka面试题、RocketMQ面试题 (史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- Netty 面试题 (史上最全、持续更新)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
随机推荐
- Cell Reports | 上海瑞金医院糜坚青等揭示组蛋白酰化/乙酰化修饰比率调控BRD4基因组分布
景杰生物 | 报道 组蛋白翻译后修饰,被认为构成一类超越基因序列的"组蛋白密码",控制着遗传信息的组织层次及其在染色质层面的解读.组蛋白赖氨酸乙酰化是研究最早的一类组蛋白修饰, ...
- HCNA Routing&Switching之STP选举规则
前文我们了解了二层环路对网络带来的影响,以及STP工作流程和BPDU数据包结构和相关字段的说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15121317. ...
- C++小知识——显示VS大括号/花括号折叠按钮
这个功能默认是关闭的,打开路径如下: 将大纲语句块改为"True" 这个功能其实很有必要真不知道为啥默认要关闭这个功能. 站在巨人的肩膀上的思想,其实已经在互联网程序员之间深入人心 ...
- Longhorn 云原生分布式块存储解决方案设计架构和概念
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? 目录 1. 设计 1.1. Longhorn Manager 和 Longhorn Engine 1.2 ...
- 002 TCP/IP模型
一.TCP/IP 的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属于TCP/IP协议,而T ...
- NOIP 模拟 $15\; \text{影子}$
题解 \(by\;zj\varphi\) 一道并查集的题 对于它路径上点权,我们可以转化一下:对于一个点,它在哪些路径上是最小的点权 那么我们排个序,从大到小加入点,每回加入时,将这个点与它所相连的且 ...
- msp432搭建平衡小车(二)
前言 上一节掌握了使用pwm驱动电机,接下来介绍如何使用msp432读取mpu6050数据 正文 首先我们得知道mpu6050通信方式,由于mpu6050只能用i2c通信,所以学会使用msp432的i ...
- reduce使用技巧
一.使用reduce同时执行map(循环)和filter(过滤) 例如,将数组中的项的值加倍,然后只选择那些大于50的项 const numbers = [10, 20, 30, 40]; const ...
- C# 二维码生成 ( QRCoder )
二维码1.前言seaconch 最近在搞二维码方面的一些东西,所以接触了一些二维码相关,那么既然用过了就要有用过了的样子 其实关于二维码的文章真的多的数不胜数,有很多写的很认真,很好,但这就像是学习一 ...
- 【mysql】截取查询分析
1. 慢查询日志 1.1 是什么 (1)MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL ...