Elasticsearch5.5+SpringBoot 2.0实践

来源:互联网 发布:caffe中softmax 编辑:程序博客网 时间:2024/06/07 18:20

1. 开发准备

1.1. es5.5.1准备

  • 下载地址:https://www.elastic.co/downloads/elasticsearch
  • linux安装请看上一篇文章。

1.2. SpringBoot下载

  • 下载地址 http://start.spring.io/
  • 选择版本 2.0.0 M3

1.3. pom.xml详细配置如下

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.example</groupId>    <artifactId>demo</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>jar</packaging>    <name>demo</name>    <description>Demo project for Spring Boot</description>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>2.0.0.M3</version>        <relativePath /> <!-- lookup parent from repository -->    </parent>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <java.version>1.8</java.version>        <elasticsearch.version>5.5.0</elasticsearch.version>        <elasticsearch.client.version>5.5.1</elasticsearch.client.version>        <spring.data.elasticsearch.version>3.0.0.RC2</spring.data.elasticsearch.version>    </properties>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>        </dependency>        <dependency>            <groupId>org.elasticsearch.client</groupId>            <artifactId>transport</artifactId>            <version>${elasticsearch.client.version}</version>        </dependency>        <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->        <dependency>            <groupId>org.elasticsearch</groupId>            <artifactId>elasticsearch</artifactId>            <version>${elasticsearch.version}</version>        </dependency>        <!-- https://mvnrepository.com/artifact/com.google.collections/google-collections -->        <dependency>            <groupId>com.google.collections</groupId>            <artifactId>google-collections</artifactId>            <version>1.0</version>        </dependency>        <!-- https://mvnrepository.com/artifact/joda-time/joda-time -->        <dependency>            <groupId>joda-time</groupId>            <artifactId>joda-time</artifactId>        </dependency>        <dependency>            <groupId>org.apache.logging.log4j</groupId>            <artifactId>log4j-to-slf4j</artifactId>            <version>2.8.2</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build>    <repositories>        <repository>            <id>spring-snapshots</id>            <name>Spring Snapshots</name>            <url>https://repo.spring.io/snapshot</url>            <snapshots>                <enabled>true</enabled>            </snapshots>        </repository>        <repository>            <id>spring-milestones</id>            <name>Spring Milestones</name>            <url>https://repo.spring.io/milestone</url>            <snapshots>                <enabled>false</enabled>            </snapshots>        </repository>        <repository>            <id>spring-libs-snapshot</id>            <name>Spring Snapshot Repository</name>            <url>http://repo.spring.io/libs-snapshot</url>        </repository>    </repositories>    <pluginRepositories>        <pluginRepository>            <id>spring-snapshots</id>            <name>Spring Snapshots</name>            <url>https://repo.spring.io/snapshot</url>            <snapshots>                <enabled>true</enabled>            </snapshots>        </pluginRepository>        <pluginRepository>            <id>spring-milestones</id>            <name>Spring Milestones</name>            <url>https://repo.spring.io/milestone</url>            <snapshots>                <enabled>false</enabled>            </snapshots>        </pluginRepository>    </pluginRepositories></project>

2. Java代码

代码结构如下

com.example.demo.model.SipBean
com.example.demo.dao.SipRepository
com.example.demo.service.SipService
com.example.demo.service.impl.SipServiceImpl
com.example.demo.action.SipController
com.example.demo.DemoApplication

2.1. model包

自己定义的类

package com.example.demo.model;import java.util.Date;import org.springframework.data.annotation.Id;import org.springframework.data.elasticsearch.annotations.Document;@Document(indexName = "t_sip", type = "sip", shards = 1, replicas = 0, refreshInterval = "-1")  public class SipBean {    @Id    private Integer id;    private Integer actiontype;    private Integer areaid;    private String assetid;    private Integer bandwidth;    private String c1url;    private String destination;    private String dstip;    private Integer dstport;    private String frequency;    private String groupcode;    private String programno;    private String purchasetoken;    private String qamname;    private String requestheader;    private String responseheader;    private Integer responsetime;    private Integer scale;    private String sessionid;    private String sn;    private String source;    private String srcip;    private Integer srcport;    private Integer statuscode;    private String statusmsg;    private Date time;    private String url;    public SipBean() {    }    public SipBean(Integer id, Integer actiontype, Integer areaid, String assetid, Integer bandwidth, String c1url,            String destination, String dstip, Integer dstport, String frequency, String groupcode, String programno,            String purchasetoken, String qamname, String requestheader, String responseheader, Integer responsetime,            Integer scale, String sessionid, String sn, String source, String srcip, Integer srcport,            Integer statuscode, String statusmsg, Date time, String url) {        this.id = id;        this.actiontype = actiontype;        this.areaid = areaid;        this.assetid = assetid;        this.bandwidth = bandwidth;        this.c1url = c1url;        this.destination = destination;        this.dstip = dstip;        this.dstport = dstport;        this.frequency = frequency;        this.groupcode = groupcode;        this.programno = programno;        this.purchasetoken = purchasetoken;        this.qamname = qamname;        this.requestheader = requestheader;        this.responseheader = responseheader;        this.responsetime = responsetime;        this.scale = scale;        this.sessionid = sessionid;        this.sn = sn;        this.source = source;        this.srcip = srcip;        this.srcport = srcport;        this.statuscode = statuscode;        this.statusmsg = statusmsg;        this.time = time;        this.url = url;    } .... getter setter ...     }

2.2. dao层

集成了ElasticsearchRepository类,里面已经实现了基本的方法,service层可以直接调用;

package com.example.demo.dao;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 com.example.demo.model.SipBean;import java.util.List;public interface SipRepository extends ElasticsearchRepository<SipBean, Integer> {    /**    *自己定义的,按照sn查询    */      @Query("{\"bool\" : {\"must\" : {\"term\" : {\"sn\" : \"?0\"}}}}")    Page<SipBean> findBySn(String sn, Pageable pageable);}

2.3. service层

具体实现的业务代码

显示接口定义SipService

package com.example.demo.service;import java.util.List;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import com.example.demo.model.SipBean;public interface SipService {    public SipBean findSip(Integer id);     public List<SipBean> findSipList();    Page<SipBean> findBySn(String sn, Integer pageNumber, Integer pageSize);    Page<SipBean> findByFuzzyQuery(String field,String value,  Integer pageNumber, Integer pageSize);    Page<SipBean> findByMutliQuery(String start,String end, String field,String value, Integer pageNumber, Integer pageSize);    Page<SipBean> findAll(Integer pageNumber, Integer pageSize) ;}

下面是Service的具体实现类

package com.example.demo.service.impl;import java.util.ArrayList;import java.util.List;import java.util.Optional;import org.elasticsearch.action.search.SearchRequestBuilder;import org.elasticsearch.index.query.BoolQueryBuilder;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.elasticsearch.search.sort.SortBuilder;import org.elasticsearch.search.sort.SortBuilders;import org.elasticsearch.search.sort.SortOrder;import org.joda.time.format.DateTimeFormat;import org.joda.time.format.DateTimeFormatter;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.data.domain.Sort;import org.springframework.data.domain.Sort.Direction;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Service;import com.example.demo.dao.SipRepository;import com.example.demo.model.SipBean;import com.example.demo.service.SipService;import com.google.common.collect.Lists;@Servicepublic class SipServiceImpl implements SipService {    @Autowired    private SipRepository sipRepository;    /**     * 按照id查詢     */    @Override    public SipBean findSip(Integer id) {        Optional<SipBean> opt = sipRepository.findById(id);        return opt.get();    }    /**     *數據不多的時候,返回所有的記錄     */    @Override    public List<SipBean> findSipList() {        Iterable<SipBean> elements = sipRepository.findAll();        List<SipBean> list = Lists.newArrayList(elements);        return list;    }    /**     * 分頁查詢,帶條件     */    @Override    public Page<SipBean> findBySn(String sn, Integer pageNumber, Integer pageSize) {        // TODO Auto-generated method stub        QueryBuilder query = QueryBuilders.matchQuery("sn",sn);        Pageable pageable = PageRequest.of(pageNumber, pageSize);        return sipRepository.search(query, pageable);    }    /**     * 分頁查詢     */    @Override    public Page<SipBean> findAll(Integer pageNumber, Integer pageSize) {        Pageable pageable = PageRequest.of(pageNumber, pageSize);        return sipRepository.findAll(pageable);    }    /**     * 分頁。模糊查詢     */    @Override    public Page<SipBean> findByFuzzyQuery(String field,String value, Integer pageNumber, Integer pageSize) {        QueryBuilder query = QueryBuilders.fuzzyQuery(field, value);        Pageable pageable = PageRequest.of(pageNumber, pageSize);        return sipRepository.search(query, pageable);    }    /**     * 分頁,時間,排序查詢     */    @Override    public Page<SipBean> findByMutliQuery(String start, String end, String field, String value, Integer pageNumber,            Integer pageSize) {                  DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");        long istart = format.parseDateTime(start).getMillis();        long iend = format.parseDateTime(end).getMillis();        BoolQueryBuilder query = QueryBuilders.boolQuery()                .must(QueryBuilders.rangeQuery("time").lte(iend).gte(istart));        if(field!=null && !"".equals(field)){            query.must(QueryBuilders.fuzzyQuery(field, value));        }               Pageable pageable = PageRequest.of(pageNumber, pageSize,Sort.by("sn"));        //Pageable pageable2 = PageRequest.of(pageNumber, pageSize,Direction.ASC,"sn","time");        return sipRepository.search(query, pageable);    }}

2.4 action层

界面调用的代码

package com.example.demo.action;import java.util.List;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.Page;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import com.example.demo.model.SipBean;@RestController@RequestMapping(value = "/sip")public class SipController {protected final Logger logger = LoggerFactory.getLogger(this.getClass());    @Autowired    private com.example.demo.service.SipService sipService;    /**     * 按照ID查詢     * @param id     * @return     */    @RequestMapping(value = "/getSipById")    @ResponseBody    public Object getSipById(Integer id){        SipBean sip =sipService.findSip(id);        return sip;    }    @RequestMapping(value = "/getSipList")    @ResponseBody    public Object getSipList(){        List<SipBean> sips =sipService.findSipList();        return sips;    }    @RequestMapping(value = "/getSipByPage")    @ResponseBody    public Page<SipBean> getSipByPage(Integer pageNumber, Integer pageSize) {        Page sips =sipService.findAll(pageNumber, pageSize);        return sips;    }    @RequestMapping(value = "/getSipBySn")    @ResponseBody    public Page<SipBean> getSipBySn(String sn,Integer pageNumber, Integer pageSize) {        Page sips =sipService.findBySn(sn, pageNumber, pageSize);        return sips;    }    @RequestMapping(value = "/getSipByFuzzyQuery")    @ResponseBody    public Page<SipBean> getSipByFuzzyQuery(String field,String value,Integer pageNumber, Integer pageSize) {        Page sips =sipService.findByFuzzyQuery(field, value, pageNumber, pageSize);        return sips;    }    @RequestMapping(value = "/findByMutliQuery")    @ResponseBody    public Page<SipBean> getMutliQuery(String start,String end,String field,String value,Integer pageNumber, Integer pageSize) {        Page sips =sipService.findByMutliQuery(start,end,field, value, pageNumber, pageSize);        return sips;    }    }

2.5. SpringBoot启动代码

package com.example.demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.ComponentScan;import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;@SpringBootApplication@EnableElasticsearchRepositories@ComponentScan("com.example.demo")public class DemoApplication {      public static void main(String[] args) {        SpringApplication.run(DemoApplication.class, args);         }   }

3. Elasticsearch连接配置

前提是你的Elasticsearch已经配置好,可以正常使用,集群或者单个都使用,稍微改动就可以了

logging.level.com.example=DEBUGlogging.level.org.springframework.data.elasticsearch=DEBUGspring.mvc.throw-exception-if-no-handler-found=truespring.resources.add-mappings=falsespring.data.elasticsearch.cluster-name=es-applicationspring.data.elasticsearch.cluster-nodes=172.17.5.223:9300,172.17.5.53:9300spring.data.elasticsearch.local=false  spring.data.elasticsearch.repositories.enabled=true 

到此,新版的es 和springboot代码已经配置完,后面就可以用写简单工具来测试。

4.测试工具

我用的工具是postman,需要的同学可以导官网上下载,后台开发必备利器!

https://www.getpostman.com/postman

原创粉丝点击