diff --git a/spring-data-elasticsearch-crud/pom.xml b/spring-data-elasticsearch-crud/pom.xml new file mode 100755 index 0000000..d0fa431 --- /dev/null +++ b/spring-data-elasticsearch-crud/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + springboot + spring-data-elasticsearch-crud + 0.0.1-SNAPSHOT + spring-data-elasticsearch-crud :: spring-data-elasticsearch - 基本案例 + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.1.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + + + org.springframework.boot + spring-boot-starter-web + + + + + junit + junit + 4.12 + + + diff --git a/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/Application.java b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/Application.java new file mode 100644 index 0000000..5070937 --- /dev/null +++ b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/Application.java @@ -0,0 +1,20 @@ +package org.spring.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Spring Boot 应用启动类 + * + * Created by bysocket on 16/4/26. + */ +// Spring Boot 应用的标识 +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + // 程序启动入口 + // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件 + SpringApplication.run(Application.class,args); + } +} diff --git a/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/controller/CityRestController.java b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/controller/CityRestController.java new file mode 100644 index 0000000..d516af0 --- /dev/null +++ b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/controller/CityRestController.java @@ -0,0 +1,91 @@ +package org.spring.springboot.controller; + +import org.spring.springboot.domain.City; +import org.spring.springboot.service.CityService; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 城市 Controller 实现 Restful HTTP 服务 + *

+ * Created by bysocket on 03/05/2017. + */ +@RestController +public class CityRestController { + + @Autowired + private CityService cityService; + + /** + * 插入 ES 新城市 + * + * @param city + * @return + */ + @RequestMapping(value = "/api/city", method = RequestMethod.POST) + public Long createCity(@RequestBody City city) { + return cityService.saveCity(city); + } + + /** + * AND 语句查询 + * + * @param description + * @param score + * @return + */ + @RequestMapping(value = "/api/city/and/find", method = RequestMethod.GET) + public List findByDescriptionAndScore(@RequestParam(value = "description") String description, + @RequestParam(value = "score") Integer score) { + return cityService.findByDescriptionAndScore(description, score); + } + + /** + * OR 语句查询 + * + * @param description + * @param score + * @return + */ + @RequestMapping(value = "/api/city/or/find", method = RequestMethod.GET) + public List findByDescriptionOrScore(@RequestParam(value = "description") String description, + @RequestParam(value = "score") Integer score) { + return cityService.findByDescriptionOrScore(description, score); + } + + /** + * 查询城市描述 + * + * @param description + * @return + */ + @RequestMapping(value = "/api/city/description/find", method = RequestMethod.GET) + public List findByDescription(@RequestParam(value = "description") String description) { + return cityService.findByDescription(description); + } + + /** + * NOT 语句查询 + * + * @param description + * @return + */ + @RequestMapping(value = "/api/city/description/not/find", method = RequestMethod.GET) + public List findByDescriptionNot(@RequestParam(value = "description") String description) { + return cityService.findByDescriptionNot(description); + } + + /** + * LIKE 语句查询 + * + * @param description + * @return + */ + @RequestMapping(value = "/api/city/like/find", method = RequestMethod.GET) + public List findByDescriptionLike(@RequestParam(value = "description") String description) { + return cityService.findByDescriptionLike(description); + } +} diff --git a/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/domain/City.java b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/domain/City.java new file mode 100644 index 0000000..2e980de --- /dev/null +++ b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/domain/City.java @@ -0,0 +1,68 @@ +package org.spring.springboot.domain; + +import org.springframework.data.elasticsearch.annotations.Document; + +import java.io.Serializable; + +/** + * 城市实体类 + *

+ * Created by bysocket on 03/05/2017. + */ +@Document(indexName = "province", type = "city") +public class City implements Serializable { + + private static final long serialVersionUID = -1L; + + /** + * 城市编号 + */ + private Long id; + + /** + * 城市名称 + */ + private String name; + + /** + * 描述 + */ + private String description; + + /** + * 城市评分 + */ + private Integer score; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getScore() { + return score; + } + + public void setScore(Integer score) { + this.score = score; + } +} diff --git a/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/repository/CityRepository.java b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/repository/CityRepository.java new file mode 100644 index 0000000..9548ae8 --- /dev/null +++ b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/repository/CityRepository.java @@ -0,0 +1,37 @@ +package org.spring.springboot.repository; + +import org.spring.springboot.domain.City; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.annotations.Query; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +import java.util.List; + +/** + * ES 操作类 + *

+ * Created by bysocket on 17/05/2017. + */ +public interface CityRepository extends ElasticsearchRepository { + /** + * @param description + * @param score + * @return + */ + List findByDescriptionAndScore(String description, Integer score); + + List findByDescriptionOrScore(String description, Integer score); + + Page findByDescription(String description, Pageable page); + +// @Query("{\"bool\" : {\"must\" : {\"term\" : {\"description\" : \"?0\"}}}}") +// Page findByDescription(String description, Pageable pageable); + + Page findByDescriptionNot(String description, Pageable page); + + Page findByDescriptionLike(String description, Pageable page); + + Page findByScoreBetween(Integer score, Pageable page); + +} diff --git a/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/service/CityService.java b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/service/CityService.java new file mode 100644 index 0000000..998c237 --- /dev/null +++ b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/service/CityService.java @@ -0,0 +1,27 @@ + +package org.spring.springboot.service; + +import org.spring.springboot.domain.City; + +import java.util.List; + +public interface CityService { + + /** + * 新增 ES 城市信息 + * + * @param city + * @return + */ + Long saveCity(City city); + + List findByDescriptionAndScore(String description, Integer score); + + List findByDescriptionOrScore(String description, Integer score); + + List findByDescription(String description); + + List findByDescriptionNot(String description); + + List findByDescriptionLike(String description); +} \ No newline at end of file diff --git a/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/service/impl/CityESServiceImpl.java b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/service/impl/CityESServiceImpl.java new file mode 100644 index 0000000..80fcf48 --- /dev/null +++ b/spring-data-elasticsearch-crud/src/main/java/org/spring/springboot/service/impl/CityESServiceImpl.java @@ -0,0 +1,60 @@ +package org.spring.springboot.service.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.spring.springboot.domain.City; +import org.spring.springboot.repository.CityRepository; +import org.spring.springboot.service.CityService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 城市 ES 业务逻辑实现类 + *

+ * Created by bysocket on 07/02/2017. + */ +@Service +public class CityESServiceImpl implements CityService { + + private static final Logger LOGGER = LoggerFactory.getLogger(CityESServiceImpl.class); + + // 分页参数 -> TODO 代码可迁移到具体项目的公共 common 模块 + private static final Integer pageNumber = 0; + private static final Integer pageSize = 10; + Pageable pageable = new PageRequest(pageNumber, pageSize); + + // ES 操作类 + @Autowired + CityRepository cityRepository; + + public Long saveCity(City city) { + City cityResult = cityRepository.save(city); + return cityResult.getId(); + } + + public List findByDescriptionAndScore(String description, Integer score) { + return cityRepository.findByDescriptionAndScore(description, score); + } + + public List findByDescriptionOrScore(String description, Integer score) { + return cityRepository.findByDescriptionOrScore(description, score); + } + + public List findByDescription(String description) { + return cityRepository.findByDescription(description, pageable).getContent(); + } + + public List findByDescriptionNot(String description) { + return cityRepository.findByDescriptionNot(description, pageable).getContent(); + } + + public List findByDescriptionLike(String description) { + return cityRepository.findByDescriptionLike(description, pageable).getContent(); + } + +} diff --git a/spring-data-elasticsearch-crud/src/main/resources/application.properties b/spring-data-elasticsearch-crud/src/main/resources/application.properties new file mode 100644 index 0000000..4f1ed6d --- /dev/null +++ b/spring-data-elasticsearch-crud/src/main/resources/application.properties @@ -0,0 +1,3 @@ +# ES +spring.data.elasticsearch.repositories.enabled = true +spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300 \ No newline at end of file