zoukankan      html  css  js  c++  java
  • [转] Spring Boot 揭秘与实战(二) 数据存储篇

    [From] http://www.tuicool.com/articles/JBvQrmj

    本文讲解Spring Boot基础下,如何使用 ElasticSearch,实现全文搜索。

    版本须知

    spring data elasticSearch 的版本与Spring boot、Elasticsearch版本需要匹配。

    Spring Boot Version (x)Spring Data Elasticsearch Version (y)Elasticsearch Version (z)
    x <= 1.3.5 y <= 1.3.4 z <= 1.7.2
    x >= 1.4.x 2.0.0 <=y <5.0.0 2.0.0 <= z < 5.0.0

    环境依赖

    修改 POM 文件,添加 spring-boot-starter-data-elasticsearch 依赖。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

    数据源

    方案一 使用 Spring Boot 默认配置

    在 src/main/resources/application.properties 中配置数据源信息。

    spring.data.elasticsearch.properties.host = 127.0.0.1
    spring.data.elasticsearch.properties.port = 9300

    通过 Java Config 创建ElasticSearchConfig。

    @Configuration
    @EnableElasticsearchRepositories("com.lianggzone.springboot.action.data.elasticsearch")
    public class ElasticSearchConfig {}

    方案二 手动创建

    通过 Java Config 创建ElasticSearchConfig。

    @Configuration
    @EnableElasticsearchRepositories("com.lianggzone.springboot.action.data.elasticsearch")
    public class ElasticsearchConfig2 {
    
        private String hostname = "127.0.0.1";
        private int port = 9300;
    
        @Bean
        public ElasticsearchOperations elasticsearchTemplate() {
            return new ElasticsearchTemplate(client());
        }
    
        @Bean
        public Client client() {
            TransportClient client = new TransportClient();
            TransportAddress address = new InetSocketTransportAddress(hostname, port);
    
            client.addTransportAddress(address);
            return client;
        }
    }

    业务操作

    实体对象

    @Document(indexName = "springbootdb", type = "news")
    public class News {
    
        @Id
        private String id;
    
        private String title;
    
        private String content;
    
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd'T'HHmmss.SSS'Z'")
        @Field(type = FieldType.Date, format = DateFormat.basic_date_time, index = FieldIndex.not_analyzed)
        @CreatedDate
        private Date createdDateTime;
    
        // GET和SET方法
    }

    DAO相关

    public interface NewsRepository extends ElasticsearchRepository<News, String> {
        public List<News> findByTitle(String title);
    }

    Service相关

    我们来定义实现类,Service层调用Dao层的方法,这个是典型的套路。

    @Service
    public class NewsService {
    
        @Autowired
        private NewsRepository newsRepository;
    
        public Iterable<News> findAll(){
            return newsRepository.findAll();
        }
    
        public Iterable<News> search(QueryBuilder query){
            return newsRepository.search(query);
        }
    
        public List <News> findByTitle(String title) {
            return this.newsRepository.findByTitle(title);
        }
    
        public void deleteAll(String id){
            this.newsRepository.delete(id);
        }
    
        public void init(){
            for (int i = 0; i < 100; i++) {
                News news = new News();
                news.setId(i+"");
                news.setTitle(i + ".梁桂钊单元测试用例");
                news.setContent("梁桂钊单元测试用例"+i+"xxxxx");
                news.setCreatedDateTime(new Date());
                this.newsRepository.save(news);
            }
        }
    }

    Controller相关

    为了展现效果,我们先定义一组简单的 RESTful API 接口进行测试。

    @RestController
    @RequestMapping(value="/data/elasticsearch/news")
    public class NewsController {
    
        @Autowired
        private NewsService newsService;
    
        /**
         * 初始化
         * @param request
         */
        @RequestMapping(value = "/init", method = RequestMethod.POST)
        public void init(HttpServletRequest request) {
            this.newsService.init();
        }
    
        /**
         * findAll        
         * @param request
         * @return
         */
        @RequestMapping(value = "/", method = RequestMethod.GET)
        public Map<String, Object> findList(HttpServletRequest request) {
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("items", this.newsService.findAll());
            return params;
        }
    
        /**
         * find      
         * @param request
         * @return
         */
        @RequestMapping(value = "/{title}", method = RequestMethod.GET)
        public Map<String, Object> search(@PathVariable String title) {
            // 构建查询条件
            QueryBuilder queryBuilder = QueryBuilders.queryString(title); // Pekkle: spring boot 1.4.1 集成elastic search后看不到此方法,用如下方法代替。
    QueryBuilder queryBuilder = QueryBuilders.simpleQueryStringQuery(title);
    Map<String, Object> params = new HashMap<String, Object>(); params.put("items", this.newsService.search(queryBuilder)); return params; } }

    总结

    上面这个简单的案例,让我们看到了 Spring Boot 整合 ElasticSearch 流程如此简单。

  • 相关阅读:
    js-计算器
    正确看待HTML5的语法变化
    什么是Web前端,Web前端是做什么的?
    css复合属性的写法
    Unicode与JavaScript详解
    input 定宽,文本超出后缩小字体,尽可能多的显示文本
    手机号中间四位加*号
    React 状态和生命周期
    还是数组 练习题 而已
    数组 练习题 而已
  • 原文地址:https://www.cnblogs.com/pekkle/p/6782967.html
Copyright © 2011-2022 走看看