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;
@Service
public 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=DEBUG
logging.level.org.springframework.data.elasticsearch=DEBUG
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
spring.data.elasticsearch.cluster-name=es-application
spring.data.elasticsearch.cluster-nodes=172.17.5.223:9300,172.17.5.53:9300
spring.data.elasticsearch.local=false
spring.data.elasticsearch.repositories.enabled=true
到此,新版的es 和springboot代码已经配置完,后面就可以用写简单工具来测试。
4.测试工具
我用的工具是postman,需要的同学可以导官网上下载,后台开发必备利器!