博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
和我一起打造个简单搜索之SpringDataElasticSearch入门
阅读量:5935 次
发布时间:2019-06-19

本文共 6270 字,大约阅读时间需要 20 分钟。

网上大多通过 java 操作 es 使用的都是 TransportClient,而介绍使用 SpringDataElasticSearch 的文章相对比较少,笔者也是摸索了许久,接下来本文介绍 SpringDataElasticSearch 的 api 使用,更加方便的进行查询。

系列文章

  • 一、
  • 二、
  • 三、
  • 四、
  • 五、
  • 六、
  • ...

环境依赖

本文以及后续 es 系列文章都基于 5.5.3 这个版本的 elasticsearch ,这个版本比较稳定,可以用于生产环境。

本文项目基于 SpringBoot 2.0.4.RELEASE 进行构建,首先引入 Spring Data ElasticSearch 的依赖。

注意:因为是 Spring Boot 项目,所以引入的依赖是 spring-boot-starter-data-elasticsearch,而不是直接引入 spring-data-elasticsearch

org.springframework.boot
spring-boot-starter-data-elasticsearch

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
{}

用过 SpringDataJPA 的朋友都应该知道,ElasticsearchRepository 的两个泛型分别为 Documet 以及 Document 的主键类型。

创建测试类

@Slf4j@SpringBootTest@RunWith(SpringRunner.class)public class BookRepositoryTest {    @Autowired    private BookRepository bookRepository;    }

演示简单查询

匹配查询(MatchQuery)

进行模糊匹配查询,这里演示的是通过 name 这个字段进行查询

@Testpublic void findBook() {    MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", "火爆娱乐天王");    bookRepository.search(matchQuery)            .forEach(e -> log.info("作品信息:{}", e));}

项查询(TermQuery)

完全匹配查询,这里演示查询 id 为 2 的数据

@Testpublic void findBook() {    TermQueryBuilder termQuery = QueryBuilders.termQuery("id", 2);    bookRepository.search(termQuery)            .forEach(e -> log.info("作品信息:{}", e));}

范围查询(Range Query)

范围查询,这里演示查询字数在 0-30w 之间的作品

@Testpublic 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 查询

201809061536241809780.png

现在来实现这个查询

BookQuery 参数封装

使用 BookQuery 类封装查询参数

@Datapublic 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;}

查询测试

@Testpublic 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

转载于:https://www.cnblogs.com/vcmq/p/9966688.html

你可能感兴趣的文章
使用python读取mysql数据库并进行数据的操作
查看>>
GitHub:我们是这样弃用jQuery的
查看>>
隐藏输入法和弹出输入法
查看>>
Linux命令之tar:文件打包(备份)、压缩、解压
查看>>
CI框架不定期更新
查看>>
Spring源码解析-AutowiredAnnotationBeanPostProcessor
查看>>
list.add并不是copy
查看>>
什么是SSL预证书?
查看>>
java中的printf方法
查看>>
web项目中idea中jsp被编译后的class与java文件在哪里?
查看>>
Python的书写规则
查看>>
深入分析golang多值返回以及闭包的实现
查看>>
简单了解云安全内容
查看>>
Flask学习
查看>>
AngularDart4.0 英雄之旅-教程-08HTTP
查看>>
对于对象的简单验证及返回处理——@JsonView ,@Valid注解的使用
查看>>
Day24 shell环境变量
查看>>
7.1 安装软件包的三种方法 7.2 rpm包介绍 7.3 rpm工具用法 7.4 yum工具用法
查看>>
Spring温故而知新 - bean的装配
查看>>
日常运维(五)
查看>>