diff --git a/README.md b/README.md index b1113b9..3f08ac8 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,9 @@ 7、SpringBoot2.0 整合 Dubbo框架 ,实现RPC服务远程调用
+ +8、SpringBoot2.0 整合 ElasticSearch框架,实现高性能搜索引擎
+ 持续更新中... ## 项目简介 diff --git a/pom.xml b/pom.xml index e390a94..5e5cb14 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,8 @@ ware-redis-cluster ware-dubbo-parent + + ware-elastic-search diff --git a/ware-elastic-search/pom.xml b/ware-elastic-search/pom.xml new file mode 100644 index 0000000..aa08eff --- /dev/null +++ b/ware-elastic-search/pom.xml @@ -0,0 +1,58 @@ + + + + middle-ware-parent + com.boot.parent + 1.0-SNAPSHOT + + 4.0.0 + com.elastic.search + ware-elastic-search + jar + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + + + org.springframework.boot + spring-boot-starter-aop + ${spring-boot.version} + + + org.springframework.boot + spring-boot-configuration-processor + ${spring-boot.version} + true + + + org.springframework + spring-context-support + ${spring.version} + + + joda-time + joda-time + ${joda.time.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + \ No newline at end of file diff --git a/ware-elastic-search/src/main/java/com/elastic/search/ElasticApplication.java b/ware-elastic-search/src/main/java/com/elastic/search/ElasticApplication.java new file mode 100644 index 0000000..9d8691a --- /dev/null +++ b/ware-elastic-search/src/main/java/com/elastic/search/ElasticApplication.java @@ -0,0 +1,11 @@ +package com.elastic.search; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ElasticApplication { + public static void main(String[] args) { + SpringApplication.run(ElasticApplication.class,args) ; + } +} diff --git a/ware-elastic-search/src/main/java/com/elastic/search/controller/RequestLogController.java b/ware-elastic-search/src/main/java/com/elastic/search/controller/RequestLogController.java new file mode 100644 index 0000000..19c18a2 --- /dev/null +++ b/ware-elastic-search/src/main/java/com/elastic/search/controller/RequestLogController.java @@ -0,0 +1,84 @@ +package com.elastic.search.controller; + +import com.elastic.search.model.RequestLog; +import com.elastic.search.service.RequestLogService; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; +import java.util.Optional; + +@RestController +public class RequestLogController { + + @Resource + private RequestLogService requestLogService ; + + /** + * 数据入库 Elastic + */ + @RequestMapping("/insert") + public String insert (){ + return requestLogService.esInsert(10) ; + } + + /** + * 查询全部 Elastic + */ + @RequestMapping("/findAll") + public Iterable findAll (){ + return requestLogService.esFindAll() ; + } + + /** + * 根据ID修改 + * ID:1560406811693 + */ + @RequestMapping("/updateById/{id}") + public String updateById (@PathVariable Long id){ + RequestLog requestLog = new RequestLog() ; + requestLog.setId(id); + requestLog.setUserName("updateName"); + return requestLogService.esUpdateById(requestLog) ; + } + + /** + * 根据ID查询 + */ + @RequestMapping("/selectById/{id}") + public RequestLog selectById (@PathVariable Long id){ + Optional requestLog = requestLogService.esSelectById(id) ; + return requestLog.get() ; + } + + /** + * 根据指定条件排序 + */ + @RequestMapping("/selectOrder") + public Iterable selectOrder (){ + return requestLogService.esFindOrder() ; + } + + /** + * 多条件排序 + */ + @RequestMapping("/selectOrders") + public Iterable selectOrders (){ + return requestLogService.esFindOrders() ; + } + + /** + * 多条件 + 范围 搜索 + */ + @RequestMapping("/search") + public Iterable search (){ + return requestLogService.search() ; + } + + /** + * 分页查询 + */ + public void findPage (){ + + } +} diff --git a/ware-elastic-search/src/main/java/com/elastic/search/model/RequestLog.java b/ware-elastic-search/src/main/java/com/elastic/search/model/RequestLog.java new file mode 100644 index 0000000..a1dc038 --- /dev/null +++ b/ware-elastic-search/src/main/java/com/elastic/search/model/RequestLog.java @@ -0,0 +1,55 @@ +package com.elastic.search.model; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; + +/** + * 点开 Document 可以看到配置内容 + * 加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。 + * indexName索引名称 理解为数据库名 限定小写 + * type 理解为数据库的表名称 + * shards = 5 默认分区数 + * replicas = 1 每个分区默认的备份数 + * refreshInterval = "1s" 刷新间隔 + * indexStoreType = "fs" 索引文件存储类型 + */ +@Document(indexName = "requestlogindex",type = "requestlog") +public class RequestLog { + //Id注解Elasticsearch里相应于该列就是主键,查询时可以使用主键查询 + @Id + private Long id; + private String orderNo; + private String userId; + private String userName; + private String createTime; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getOrderNo() { + return orderNo; + } + public void setOrderNo(String orderNo) { + this.orderNo = orderNo == null ? null : orderNo.trim(); + } + public String getUserId() { + return userId; + } + public void setUserId(String userId) { + this.userId = userId == null ? null : userId.trim(); + } + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName == null ? null : userName.trim(); + } + public String getCreateTime() { + return createTime; + } + public void setCreateTime(String createTime) { + this.createTime = createTime; + } +} diff --git a/ware-elastic-search/src/main/java/com/elastic/search/repository/RequestLogRepository.java b/ware-elastic-search/src/main/java/com/elastic/search/repository/RequestLogRepository.java new file mode 100644 index 0000000..d12ed85 --- /dev/null +++ b/ware-elastic-search/src/main/java/com/elastic/search/repository/RequestLogRepository.java @@ -0,0 +1,7 @@ +package com.elastic.search.repository; + +import com.elastic.search.model.RequestLog; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +public interface RequestLogRepository extends ElasticsearchRepository { +} diff --git a/ware-elastic-search/src/main/java/com/elastic/search/service/RequestLogService.java b/ware-elastic-search/src/main/java/com/elastic/search/service/RequestLogService.java new file mode 100644 index 0000000..7166665 --- /dev/null +++ b/ware-elastic-search/src/main/java/com/elastic/search/service/RequestLogService.java @@ -0,0 +1,15 @@ +package com.elastic.search.service; + +import com.elastic.search.model.RequestLog; + +import java.util.Optional; + +public interface RequestLogService { + String esInsert (Integer num) ; + Iterable esFindAll () ; + String esUpdateById (RequestLog requestLog) ; + Optional esSelectById (Long id) ; + Iterable esFindOrder () ; + Iterable esFindOrders () ; + Iterable search () ; +} diff --git a/ware-elastic-search/src/main/java/com/elastic/search/service/impl/RequestLogServiceImpl.java b/ware-elastic-search/src/main/java/com/elastic/search/service/impl/RequestLogServiceImpl.java new file mode 100644 index 0000000..11afdfa --- /dev/null +++ b/ware-elastic-search/src/main/java/com/elastic/search/service/impl/RequestLogServiceImpl.java @@ -0,0 +1,91 @@ +package com.elastic.search.service.impl; + +import com.elastic.search.model.RequestLog; +import com.elastic.search.repository.RequestLogRepository; +import com.elastic.search.service.RequestLogService; +import com.elastic.search.util.DateUtil; +import org.elasticsearch.index.query.*; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +@Service +public class RequestLogServiceImpl implements RequestLogService { + + @Resource + private RequestLogRepository requestLogRepository ; + + @Override + public String esInsert(Integer num) { + for (int i = 0 ; i < num ; i++){ + RequestLog requestLog = new RequestLog() ; + requestLog.setId(System.currentTimeMillis()); + requestLog.setOrderNo(DateUtil.formatDate(new Date(),DateUtil.DATE_FORMAT_02)+System.currentTimeMillis()); + requestLog.setUserId("userId"+i); + requestLog.setUserName("张三"+i); + requestLog.setCreateTime(DateUtil.formatDate(new Date(),DateUtil.DATE_FORMAT_01)); + requestLogRepository.save(requestLog) ; + } + return "success" ; + } + + @Override + public Iterable esFindAll (){ + return requestLogRepository.findAll() ; + } + + @Override + public String esUpdateById(RequestLog requestLog) { + requestLogRepository.save(requestLog); + return "success" ; + } + + @Override + public Optional esSelectById(Long id) { + return requestLogRepository.findById(id) ; + } + + @Override + public Iterable esFindOrder() { + // 用户名倒序 + // Sort sort = new Sort(Sort.Direction.DESC,"userName.keyword") ; + // 创建时间正序 + Sort sort = new Sort(Sort.Direction.ASC,"createTime.keyword") ; + return requestLogRepository.findAll(sort) ; + } + + @Override + public Iterable esFindOrders() { + List sortList = new ArrayList<>() ; + Sort.Order sort1 = new Sort.Order(Sort.Direction.ASC,"createTime.keyword") ; + Sort.Order sort2 = new Sort.Order(Sort.Direction.DESC,"userName.keyword") ; + sortList.add(sort1) ; + sortList.add(sort2) ; + Sort orders = Sort.by(sortList) ; + return requestLogRepository.findAll(orders) ; + } + + @Override + public Iterable search() { + // 全文搜索关键字 + /* + String queryString="张三"; + QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString); + requestLogRepository.search(builder) ; + */ + + /* + * 多条件查询 + */ + QueryBuilder builder = QueryBuilders.boolQuery() + // .must(QueryBuilders.matchQuery("userName.keyword", "历张")) 搜索不到 + .must(QueryBuilders.matchQuery("userName", "张三")) // 可以搜索 + .must(QueryBuilders.matchQuery("orderNo", "20190613736278243")); + return requestLogRepository.search(builder) ; + } + +} diff --git a/ware-elastic-search/src/main/java/com/elastic/search/util/DateUtil.java b/ware-elastic-search/src/main/java/com/elastic/search/util/DateUtil.java new file mode 100644 index 0000000..245f6aa --- /dev/null +++ b/ware-elastic-search/src/main/java/com/elastic/search/util/DateUtil.java @@ -0,0 +1,22 @@ +package com.elastic.search.util; + +import org.joda.time.DateTime; +import java.util.Date; + +/** + * 基于 JODA 组件的时间工具类 + */ +public class DateUtil { + + private DateUtil (){} + + public static final String DATE_FORMAT_01 = "yyyy-MM-dd HH:mm:ss" ; + public static final String DATE_FORMAT_02 = "yyyyMMdd" ; + /** + * 指定格式获取时间 + */ + public static String formatDate (Date date,String dateFormat){ + DateTime dateTime = new DateTime(date) ; + return dateTime.toString(dateFormat) ; + } +} diff --git a/ware-elastic-search/src/main/resources/application.yml b/ware-elastic-search/src/main/resources/application.yml new file mode 100644 index 0000000..66545c0 --- /dev/null +++ b/ware-elastic-search/src/main/resources/application.yml @@ -0,0 +1,19 @@ +# Tomcat +server: + tomcat: + uri-encoding: UTF-8 + max-threads: 1000 + min-spare-threads: 30 + port: 7007 + connection-timeout: 5000ms + +spring: + application: + name: ware-elastic-search + data: + elasticsearch: + # 默认 elasticsearch + cluster-name: elasticsearch + # 9200作为Http协议,主要用于外部通讯 + # 9300作为Tcp协议,jar之间就是通过tcp协议通讯 + cluster-nodes: 192.168.72.130:9300