和我一起打造个简单搜索之SpringDataElasticSearch入门
网上大多通过 java 操作 es 使用的都是 TransportClient,而介绍使用 SpringDataElasticSearch 的文章相对比较少,笔者也是摸索了许久,接下来本文介绍 SpringDataElasticSearch 的 api 使用,更加方便的进行查询。
系列文章
- 一、和我一起打造个简单搜索之ElasticSearch集群搭建
- 二、和我一起打造个简单搜索之ElasticSearch入门
- 三、和我一起打造个简单搜索之IK分词以及拼音分词
- 四、和我一起打造个简单搜索之Logstash实时同步建立索引
- 五、和我一起打造个简单搜索之SpringDataElasticSearch入门
- 六、和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮
- ...
环境依赖
本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳定,可以用于生产环境。
本文项目基于 SpringBoot 2.0.4.RELEASE 进行构建,首先引入 Spring Data ElasticSearch 的依赖。
注意:因为是 Spring Boot 项目,所以引入的依赖是 spring-boot-starter-data-elasticsearch,而不是直接引入 spring-data-elasticsearch。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
Spring Data ElasticSearch 与 ElasticSearch 有对应关系
| spring data elasticsearch | elasticsearch |
|---|---|
| 3.1.x | 6.2.2 |
| 3.0.x | 5.5.0 |
| 2.1.x | 2.4.0 |
| 2.0.x | 2.2.0 |
| 1.3.x | 1.5.2 |
而本文使用的 SpringBoot 2.0.4.RELEASE 自动依赖的 Spring Data ElasticSearch 版本是 3.0.9.RELEASE,对应的 elasticsearch 版本是 5.5.x,可知依赖是正确的版本。
创建 Document 类
@Data
@Document(indexName = "novel", type = "book", createIndex = false)
public class Book implements Serializable {
private static final long serialVersionUID = 8504604495927552402L;
/**
* 需要添加 @Id 标识主键
*/
@Id
private Integer id;
private Integer words;
private String intro;
private String name;
private Integer sort;
private Boolean vip;
private Integer site;
private String author;
private Integer collection;
private Integer click;
private Integer popularity;
private Integer goods;
private Integer status;
/**
* 需要自定义时间格式化格式,否则会使用默认时间格式化
*/
@JsonFormat (shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd HH:mm:ss")
private Date updatetime;
}
这个 Document 类封装了索引的全部字段信息,注意字段名称要与索引类型的字段名称一致。
创建 Repository 接口
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {
}
用过 SpringDataJPA 的朋友都应该知道,ElasticsearchRepository 的两个泛型分别为 Documet 以及 Document 的主键类型。
创建测试类
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class BookRepositoryTest {
@Autowired
private BookRepository bookRepository;
}
演示简单查询
匹配查询(MatchQuery)
进行模糊匹配查询,这里演示的是通过 name 这个字段进行查询
@Test
public void findBook() {
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", "火爆娱乐天王");
bookRepository.search(matchQuery)
.forEach(e -> log.info("作品信息:{}", e));
}
项查询(TermQuery)
完全匹配查询,这里演示查询 id 为 2 的数据
@Test
public void findBook() {
TermQueryBuilder termQuery = QueryBuilders.termQuery("id", 2);
bookRepository.search(termQuery)
.forEach(e -> log.info("作品信息:{}", e));
}
范围查询(Range Query)
范围查询,这里演示查询字数在 0-30w 之间的作品
@Test
public void findBook() {
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("words").gt(0).lt(300000);
bookRepository.search(rangeQuery)
.forEach(e -> log.info("作品信息:{}", e));
}
注意:如果对时间进行范围查询,注意不能传递 Date 对象或者 毫秒值,只能传递 yyyy-MM-dd HH:mm:ss 格式的字符串时间参数。
复合查询
以上演示了几个基本查询,但是如果要实现多筛选条件的查询,就需要把多个基本查询进行组合,这里就用到了 bool 查询

现在来实现这个查询
BookQuery 参数封装
使用 BookQuery 类封装查询参数
@Data
public class BookQuery {
private String queryString;
private Integer page = 1;
private Integer size = 20;
private Integer wordsBegin;
private Integer wordsEnd;
private Integer sort;
private Boolean vip;
private Integer site;
private Integer collection;
private Integer click;
private Integer popularity;
private Integer goods;
private Integer status;
private Date updatetime;
}
查询测试
@Test
public void findBook() {
BookQuery query = new BookQuery();
query.setQueryString("魔");
query.setSite(2);// 1 是男生 2 是女生
query.setSort(29); // 29 是玄幻
query.setVip(true);// 查询 vip 作品
query.setWordsBegin(0); // 查询字数在 0-25w 之间的作品
query.setWordsEnd(500000);
query.setPage(1);// 分页页码
query.setSize(10);// 每页显示数
// 复合查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 以下为查询条件, 使用 must query 进行查询组合
MultiMatchQueryBuilder matchQuery = QueryBuilders.multiMatchQuery(query.getQueryString(), "name", "intro", "author");
boolQuery.must(matchQuery);
// 以下为过滤筛选条件,使用 filter 比使用 must query 性能要好
TermQueryBuilder siteQuery = QueryBuilders.termQuery("site", query.getSite());
boolQuery.filter(siteQuery);
TermQueryBuilder sortQuery = QueryBuilders.termQuery("sort", query.getSort());
boolQuery.filter(sortQuery);
TermQueryBuilder vipQuery = QueryBuilders.termQuery("vip", query.getVip());
boolQuery.filter(vipQuery);
RangeQueryBuilder wordsQuery = QueryBuilders.rangeQuery("words").gt(query.getWordsBegin()).lt(query.getWordsEnd());
boolQuery.filter(wordsQuery);
Sort sort = Sort.by(Sort.Direction.DESC, "click");
// 分页 同时根据 点击数 click 进行降序排列
PageRequest pageRequest = PageRequest.of(query.getPage() - 1, query.getSize(), sort);
log.info("{}", boolQuery);
bookRepository.search(boolQuery, pageRequest)
.forEach(e -> log.info("作品信息:{}", e));
}
查出结果:
2018-09-12 22:33:05.750 INFO 25896 --- [ main] i.g.mosiki.search.BookRepositoryTest : 作品信息:Book(id=7, words=345004, intro= 推荐《寻龙传》《魂摄天下》 作品属玄幻异界大陆风格! 可惜频道不能更改只能在奇幻混! 书友群:292... , name=灭魔成圣, sort=29, vip=true, site=2, author=等待潇湘诗社, collection=13, click=63263, popularity=2314, goods=5353, status=0, updatetime=Tue Sep 04 16:54:15 CST 2018)
2018-09-12 22:33:05.751 INFO 25896 --- [ main] i.g.mosiki.search.BookRepositoryTest : 作品信息:Book(id=9, words=233000, intro= 一名地球的平凡的少年,因为一场游戏,获得死神的传承,从而穿越到另外一片陌生的大陆,从此开启了一段传奇的人生,九天星河,吾乃死神,掌控生死,判夺罪恶,我从没见过地狱,因为我的名字,便代表地狱,吾乃死神,吾名林天。(PS:单女主,爽文不虐心,主角以杀证道,杀该杀之人,不圣母,略腹黑) 各位书友要是觉得《带着死神去穿越》还不错的话请不要忘记向您QQ群和微博里的朋友推荐哦!带着死神去穿越最新章节,带着死神去穿越无弹窗,带着死神去穿越全文阅读. , name=带着死神去穿越, sort=29, vip=true, site=2, author=梦侍, collection=6326, click=523, popularity=135, goods=34252, status=0, updatetime=Thu Dec 28 04:53:07 CST 2017)
2018-09-12 22:33:05.751 INFO 25896 --- [ main] i.g.mosiki.search.BookRepositoryTest : 作品信息:Book(id=5, words=490000, intro= 富家子弟墨浞因为发现了村子中的秘密,在良心与亲情的折磨下,逃到了边境小城。因为一个香-艳而又恐怖的梦,墨浞经历了一些诡异的事,从而得知自己的前世与今生的使命。踏上藏地,历经磨难,克服了自己的心魔,战胜了... , name=伏魔, sort=29, vip=true, site=2, author=一叶style, collection=526, click=9, popularity=41516, goods=7687, status=0, updatetime=Thu Sep 06 04:54:05 CST 2018)
最后
SpringDataElasticSearch 入门就到这里了,是不是很简单呢?
本文示例项目地址:https://github.com/Mosiki/SpringDataElasticSearchQuickStartExample
有疑问?
欢迎来信,给我写信
参考
- https://blog.csdn.net/tianyaleixiaowu/article/details/77965257
- https://tech.youzan.com/search-engine1/#43filteredquery
和我一起打造个简单搜索之SpringDataElasticSearch入门的更多相关文章
- 和我一起打造个简单搜索之SpringDataElasticSearch关键词高亮
前面几篇文章详细讲解了 ElasticSearch 的搭建以及使用 SpringDataElasticSearch 来完成搜索查询,但是搜索一般都会有搜索关键字高亮的功能,今天我们把它给加上. 系列文 ...
- 和我一起打造个简单搜索之ElasticSearch入门
本文简单介绍了使用 Rest 接口,对 es 进行操作,更深入的学习,可以参考文末部分. 环境 本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳 ...
- 和我一起打造个简单搜索之Logstash实时同步建立索引
用过 Solr 的朋友都知道,Solr 可以直接在配置文件中配置数据库连接从而完成索引的同步创建,但是 ElasticSearch 本身并不具备这样的功能,那如何建立索引呢?方法其实很多,可以使用 J ...
- 和我一起打造个简单搜索之IK分词以及拼音分词
elasticsearch 官方默认的分词插件,对中文分词效果不理想,它是把中文词语分成了一个一个的汉字.所以我们引入 es 插件 es-ik.同时为了提升用户体验,引入 es-pinyin 插件.本 ...
- 和我一起打造个简单搜索之ElasticSearch集群搭建
我们所常见的电商搜索如京东,搜索页面都会提供各种各样的筛选条件,比如品牌.尺寸.适用季节.价格区间等,同时提供排序,比如价格排序,信誉排序,销量排序等,方便了用户去找到自己心里理想的商品. 站内搜索对 ...
- 《ElasticSearch6.x实战教程》之简单搜索、Java客户端(上)
第五章-简单搜索 众里寻他千百度 搜索是ES的核心,本节讲解一些基本的简单的搜索. 掌握ES搜索查询的RESTful的API犹如掌握关系型数据库的SQL语句,尽管Java客户端API为我们不需要我们去 ...
- ElasticSearch 5学习(4)——简单搜索笔记
空搜索: GET /_search hits: total 总数 hits 前10条数据 hits 数组中的每个结果都包含_index._type和文档的_id字段,被加入到_source字段中这意味 ...
- nyoj 284 坦克大战 简单搜索
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...
- 分布式搜索ElasticSearch构建集群与简单搜索实例应用
分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...
随机推荐
- linux resin 安装 配置 相关
resin跟tomcat一样,也是解析jsp网站的,也需要JDK的支持,所以第一步也是安装JDK,安装JDK的方法参考Tomcat中的安装JDK部分.下面介绍安装resin.resin官网http:/ ...
- dos批处理(bat)运行exe
@echo off SETLOCAL ENABLEDELAYEDEXPANSIONREM 延迟环境变量扩展 color E echo operate:1.start启动 2.stop停止 3.exit ...
- 相对于父元素的fixed定位的实现
问题描述 之前在项目中,遇到了一个场景,需要实现相对于父元素的fixed定位:在父元素内拖动滚动条时,"fixed"定位的元素不能滑动,在外层拖动滚动条时,父元素及父元素内的所有元 ...
- tensorflow nan
https://github.com/tensorflow/tensorflow/issues/3212 NaNs usually indicate something wrong with your ...
- SSM框架整合(Spring+SpringMVC+MyBatis+Oracle)
1.开发环境搭建以及创建Maven Web项目 参看之前的博文[确保maven web项目不报错]:http://www.cnblogs.com/cainiaomahua/p/6306476.html ...
- shell中与C语言中的区别
shell中为啥与C语言有区别呢?弄成一样的不是很好么,其实不然,shell提供很多操作,这些操作不单单是执行程序或者命令,在很多时候是执行脚本的,简单的shell就是脚本编程,它的主要目的是处理文件 ...
- 软工网络15Alpha阶段敏捷冲刺博客集合
博客链接集合 第一篇:http://www.cnblogs.com/net15/p/8885400.html 第二篇:http://www.cnblogs.com/net15/p/8893808.ht ...
- salt 配置管理
索引 saltstack入门 salt state sls 描述文件 saltstack配置管理高级功能 saltstack入门 192.168.86.3 salt 修改 [root@Zabbix-s ...
- Vuejs——(4)v-if、v-for
版权声明:出处http://blog.csdn.net/qq20004604 目录(?)[+] (二十)v-if ①标准v-if用法 简单来说,该值为true则显示该标签,为false则不显示 ...
- vs2015 打开项目自动运行 npm install
问题:VS2015(visual studio 2015) 打开项目自动运行 npm install 解决办法: 打开工具-选项-项目与解决方案--外部web工具 去掉npm勾选 还有如果文件g ...