From b1432f838ae3e284273d85cf6b6355b649445ad6 Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Thu, 20 Dec 2018 21:26:27 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20spring-boot-demo-elasticsearch=20?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spring-boot-demo-elasticsearch/pom.xml | 112 ++++++++------ ...pringBootDemoElasticsearchApplication.java | 7 +- .../elasticsearch/constants/EsConsts.java | 26 ++++ .../xkcoding/elasticsearch/model/Person.java | 67 +++++++++ .../repository/PersonRepository.java | 31 ++++ .../src/main/resources/application.yml | 5 +- .../repository/PersonRepositoryTest.java | 139 ++++++++++++++++++ .../elasticsearch/template/TemplateTest.java | 45 ++++++ 8 files changed, 379 insertions(+), 53 deletions(-) create mode 100644 spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/constants/EsConsts.java create mode 100644 spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/model/Person.java create mode 100644 spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/repository/PersonRepository.java create mode 100644 spring-boot-demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/repository/PersonRepositoryTest.java create mode 100644 spring-boot-demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/template/TemplateTest.java diff --git a/spring-boot-demo-elasticsearch/pom.xml b/spring-boot-demo-elasticsearch/pom.xml index 2fb6158..340d524 100644 --- a/spring-boot-demo-elasticsearch/pom.xml +++ b/spring-boot-demo-elasticsearch/pom.xml @@ -1,53 +1,69 @@ - 4.0.0 - - spring-boot-demo-elasticsearch - 1.0.0-SNAPSHOT - jar - - spring-boot-demo-elasticsearch - Demo project for Spring Boot - - - com.xkcoding - spring-boot-demo - 1.0.0-SNAPSHOT - - - - UTF-8 - UTF-8 - 1.8 - - - - - org.springframework.boot - spring-boot-starter-data-elasticsearch - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - spring-boot-demo-elasticsearch - - - org.springframework.boot - spring-boot-maven-plugin - - - + 4.0.0 + + spring-boot-demo-elasticsearch + 1.0.0-SNAPSHOT + jar + + spring-boot-demo-elasticsearch + Demo project for Spring Boot + + + com.xkcoding + spring-boot-demo + 1.0.0-SNAPSHOT + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.projectlombok + lombok + true + + + + cn.hutool + hutool-all + + + + com.google.guava + guava + + + + + spring-boot-demo-elasticsearch + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/SpringBootDemoElasticsearchApplication.java b/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/SpringBootDemoElasticsearchApplication.java index 85a04b8..12218b7 100644 --- a/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/SpringBootDemoElasticsearchApplication.java +++ b/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/SpringBootDemoElasticsearchApplication.java @@ -19,7 +19,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringBootDemoElasticsearchApplication { - public static void main(String[] args) { - SpringApplication.run(SpringBootDemoElasticsearchApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringBootDemoElasticsearchApplication.class, args); + } + } diff --git a/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/constants/EsConsts.java b/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/constants/EsConsts.java new file mode 100644 index 0000000..7753b45 --- /dev/null +++ b/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/constants/EsConsts.java @@ -0,0 +1,26 @@ +package com.xkcoding.elasticsearch.constants; + +/** + *

+ * ES常量池 + *

+ * + * @package: com.xkcoding.elasticsearch.constants + * @description: ES常量池 + * @author: yangkai.shen + * @date: Created in 2018-12-20 17:30 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface EsConsts { + /** + * 索引名称 + */ + String INDEX_NAME = "person"; + + /** + * 类型名称 + */ + String TYPE_NAME = "person"; +} diff --git a/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/model/Person.java b/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/model/Person.java new file mode 100644 index 0000000..614af61 --- /dev/null +++ b/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/model/Person.java @@ -0,0 +1,67 @@ +package com.xkcoding.elasticsearch.model; + +import com.xkcoding.elasticsearch.constants.EsConsts; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; + +import java.util.Date; + +/** + *

+ * 用户实体类 + *

+ * + * @package: com.xkcoding.elasticsearch.model + * @description: 用户实体类 + * @author: yangkai.shen + * @date: Created in 2018-12-20 17:29 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Document(indexName = EsConsts.INDEX_NAME, type = EsConsts.TYPE_NAME, shards = 1, replicas = 0) +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Person { + /** + * 主键 + */ + @Id + private Long id; + + /** + * 名字 + */ + @Field(type = FieldType.Keyword) + private String name; + + /** + * 国家 + */ + @Field(type = FieldType.Keyword) + private String country; + + /** + * 年龄 + */ + @Field(type = FieldType.Integer) + private Integer age; + + /** + * 生日 + */ + @Field(type = FieldType.Date) + private Date birthday; + + /** + * 介绍 + */ + @Field(type = FieldType.Text, analyzer = "ik_smart") + private String remark; +} diff --git a/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/repository/PersonRepository.java b/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/repository/PersonRepository.java new file mode 100644 index 0000000..5158d33 --- /dev/null +++ b/spring-boot-demo-elasticsearch/src/main/java/com/xkcoding/elasticsearch/repository/PersonRepository.java @@ -0,0 +1,31 @@ +package com.xkcoding.elasticsearch.repository; + +import com.xkcoding.elasticsearch.model.Person; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +import java.util.List; + +/** + *

+ * 用户持久层 + *

+ * + * @package: com.xkcoding.elasticsearch.repository + * @description: 用户持久层 + * @author: yangkai.shen + * @date: Created in 2018-12-20 19:00 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface PersonRepository extends ElasticsearchRepository { + + /** + * 根据年龄区间查询 + * + * @param min 最小值 + * @param max 最大值 + * @return 满足条件的用户列表 + */ + List findByAgeBetween(Integer min, Integer max); +} diff --git a/spring-boot-demo-elasticsearch/src/main/resources/application.yml b/spring-boot-demo-elasticsearch/src/main/resources/application.yml index 8cb6a76..5810bae 100644 --- a/spring-boot-demo-elasticsearch/src/main/resources/application.yml +++ b/spring-boot-demo-elasticsearch/src/main/resources/application.yml @@ -1,5 +1,6 @@ spring: data: elasticsearch: - cluster-name: elasticsearch - cluster-nodes: 127.0.0.1:9300 \ No newline at end of file + #cluster-name: elasticsearch + cluster-name: metadata_es + cluster-nodes: 192.168.241.19:9300 \ No newline at end of file diff --git a/spring-boot-demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/repository/PersonRepositoryTest.java b/spring-boot-demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/repository/PersonRepositoryTest.java new file mode 100644 index 0000000..4636199 --- /dev/null +++ b/spring-boot-demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/repository/PersonRepositoryTest.java @@ -0,0 +1,139 @@ +package com.xkcoding.elasticsearch.repository; + +import cn.hutool.core.date.DateUtil; +import com.google.common.collect.Lists; +import com.xkcoding.elasticsearch.SpringBootDemoElasticsearchApplicationTests; +import com.xkcoding.elasticsearch.model.Person; +import lombok.extern.slf4j.Slf4j; +import org.elasticsearch.index.query.MatchQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.sort.SortBuilders; +import org.elasticsearch.search.sort.SortOrder; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage; +import org.springframework.data.elasticsearch.core.query.FetchSourceFilter; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; + +import java.util.List; + +/** + *

+ * 测试 Repository 操作ES + *

+ * + * @package: com.xkcoding.elasticsearch.repository + * @description: 测试 Repository 操作ES + * @author: yangkai.shen + * @date: Created in 2018-12-20 19:03 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +public class PersonRepositoryTest extends SpringBootDemoElasticsearchApplicationTests { + @Autowired + private PersonRepository repo; + + /** + * 测试新增 + */ + @Test + public void save() { + Person person = new Person(1L, "刘备", "蜀国", 18, DateUtil.parse("1990-01-02 03:04:05"), "刘备(161年-223年6月10日),即汉昭烈帝(221年-223年在位),又称先主,字玄德,东汉末年幽州涿郡涿县(今河北省涿州市)人,西汉中山靖王刘胜之后,三国时期蜀汉开国皇帝、政治家。\n刘备少年时拜卢植为师;早年颠沛流离,备尝艰辛,投靠过多个诸侯,曾参与镇压黄巾起义。先后率军救援北海相孔融、徐州牧陶谦等。陶谦病亡后,将徐州让与刘备。赤壁之战时,刘备与孙权联盟击败曹操,趁势夺取荆州。而后进取益州。于章武元年(221年)在成都称帝,国号汉,史称蜀或蜀汉。《三国志》评刘备的机权干略不及曹操,但其弘毅宽厚,知人待士,百折不挠,终成帝业。刘备也称自己做事“每与操反,事乃成尔”。\n章武三年(223年),刘备病逝于白帝城,终年六十三岁,谥号昭烈皇帝,庙号烈祖,葬惠陵。后世有众多文艺作品以其为主角,在成都武侯祠有昭烈庙为纪念。"); + Person save = repo.save(person); + log.info("【save】= {}", save); + } + + /** + * 测试批量新增 + */ + @Test + public void saveList() { + List personList = Lists.newArrayList(); + personList.add(new Person(2L, "曹操", "魏国", 20, DateUtil.parse("1988-01-02 03:04:05"), "曹操(155年-220年3月15日),字孟德,一名吉利,小字阿瞒,沛国谯县(今安徽亳州)人。东汉末年杰出的政治家、军事家、文学家、书法家,三国中曹魏政权的奠基人。\n曹操曾担任东汉丞相,后加封魏王,奠定了曹魏立国的基础。去世后谥号为武王。其子曹丕称帝后,追尊为武皇帝,庙号太祖。\n东汉末年,天下大乱,曹操以汉天子的名义征讨四方,对内消灭二袁、吕布、刘表、马超、韩遂等割据势力,对外降服南匈奴、乌桓、鲜卑等,统一了中国北方,并实行一系列政策恢复经济生产和社会秩序,扩大屯田、兴修水利、奖励农桑、重视手工业、安置流亡人口、实行“租调制”,从而使中原社会渐趋稳定、经济出现转机。黄河流域在曹操统治下,政治渐见清明,经济逐步恢复,阶级压迫稍有减轻,社会风气有所好转。曹操在汉朝的名义下所采取的一些措施具有积极作用。\n曹操军事上精通兵法,重贤爱才,为此不惜一切代价将看中的潜能分子收于麾下;生活上善诗歌,抒发自己的政治抱负,并反映汉末人民的苦难生活,气魄雄伟,慷慨悲凉;散文亦清峻整洁,开启并繁荣了建安文学,给后人留下了宝贵的精神财富,鲁迅评价其为“改造文章的祖师”。同时曹操也擅长书法,唐朝张怀瓘在《书断》将曹操的章草评为“妙品”。")); + personList.add(new Person(3L, "孙权", "吴国", 19, DateUtil.parse("1989-01-02 03:04:05"), "孙权(182年-252年5月21日),字仲谋,吴郡富春(今浙江杭州富阳区)人。三国时代孙吴的建立者(229年-252年在位)。\n孙权的父亲孙坚和兄长孙策,在东汉末年群雄割据中打下了江东基业。建安五年(200年),孙策遇刺身亡,孙权继之掌事,成为一方诸侯。建安十三年(208年),与刘备建立孙刘联盟,并于赤壁之战中击败曹操,奠定三国鼎立的基础。建安二十四年(219年),孙权派吕蒙成功袭取刘备的荆州,使领土面积大大增加。\n黄武元年(222年),孙权被魏文帝曹丕册封为吴王,建立吴国。同年,在夷陵之战中大败刘备。黄龙元年(229年),在武昌正式称帝,国号吴,不久后迁都建业。孙权称帝后,设置农官,实行屯田,设置郡县,并继续剿抚山越,促进了江南经济的发展。在此基础上,他又多次派人出海。黄龙二年(230年),孙权派卫温、诸葛直抵达夷州。\n孙权晚年在继承人问题上反复无常,引致群下党争,朝局不稳。太元元年(252年)病逝,享年七十一岁,在位二十四年,谥号大皇帝,庙号太祖,葬于蒋陵。\n孙权亦善书,唐代张怀瓘在《书估》中将其书法列为第三等。")); + Iterable people = repo.saveAll(personList); + log.info("【people】= {}", people); + } + + /** + * 测试更新 + */ + @Test + public void update() { + repo.findById(1L).ifPresent(person -> { + person.setRemark(person.getRemark() + "\n更新更新更新更新更新"); + Person save = repo.save(person); + log.info("【save】= {}", save); + }); + } + + /** + * 测试删除 + */ + @Test + public void delete() { + // 主键删除 + repo.deleteById(1L); + + // 对象删除 + repo.findById(2L).ifPresent(person -> repo.delete(person)); + + // 批量删除 + repo.deleteAll(repo.findAll()); + } + + /** + * 测试普通查询,按生日倒序 + */ + @Test + public void select() { + repo.findAll(Sort.by(Sort.Direction.DESC, "birthday")) + .forEach(person -> log.info("{} 生日: {}", person.getName(), DateUtil.formatDateTime(person.getBirthday()))); + } + + /** + * 自定义查询,根据年龄范围查询 + */ + @Test + public void customSelectRangeOfAge() { + repo.findByAgeBetween(18, 19).forEach(person -> log.info("{} 年龄: {}", person.getName(), person.getAge())); + } + + /** + * 高级查询 + */ + @Test + public void advanceSelect() { + // QueryBuilders 提供了很多静态方法,可以实现大部分查询条件的封装 + MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "孙权"); + log.info("【queryBuilder】= {}", queryBuilder.toString()); + + repo.search(queryBuilder).forEach(person -> log.info("【person】= {}", person)); + } + + /** + * 自定义高级查询 + */ + @Test + public void customAdvanceSelect() { + // 构造查询条件 + NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); + // 添加基本的分词条件 + queryBuilder.withQuery(QueryBuilders.matchQuery("remark", "东汉")); + // 排序条件 + queryBuilder.withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC)); + // 分页条件 + queryBuilder.withPageable(PageRequest.of(0, 2)); + Page people = repo.search(queryBuilder.build()); + log.info("【people】总条数 = {}", people.getTotalElements()); + log.info("【people】总页数 = {}", people.getTotalPages()); + people.forEach(person -> log.info("【person】= {},年龄 = {}", person.getName(), person.getAge())); + } + +} \ No newline at end of file diff --git a/spring-boot-demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/template/TemplateTest.java b/spring-boot-demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/template/TemplateTest.java new file mode 100644 index 0000000..4e95257 --- /dev/null +++ b/spring-boot-demo-elasticsearch/src/test/java/com/xkcoding/elasticsearch/template/TemplateTest.java @@ -0,0 +1,45 @@ +package com.xkcoding.elasticsearch.template; + +import com.xkcoding.elasticsearch.SpringBootDemoElasticsearchApplicationTests; +import com.xkcoding.elasticsearch.model.Person; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; + +/** + *

+ * 测试 ElasticTemplate 的创建/删除 + *

+ * + * @package: com.xkcoding.elasticsearch.template + * @description: 测试 ElasticTemplate 的创建/删除 + * @author: yangkai.shen + * @date: Created in 2018-12-20 17:46 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public class TemplateTest extends SpringBootDemoElasticsearchApplicationTests { + @Autowired + private ElasticsearchTemplate esTemplate; + + /** + * 测试 ElasticTemplate 创建 index + */ + @Test + public void testCreateIndex() { + // 创建索引,会根据Item类的@Document注解信息来创建 + esTemplate.createIndex(Person.class); + + // 配置映射,会根据Item类中的id、Field等字段来自动完成映射 + esTemplate.putMapping(Person.class); + } + + /** + * 测试 ElasticTemplate 删除 index + */ + @Test + public void testDeleteIndex() { + esTemplate.deleteIndex(Person.class); + } +}