1.添加elasticsearch依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.配置文件
data:
# elasticsearch:
# cluster-name: elasticsearch
# cluster-nodes: localhost:9300
# repositories:
# enable: true
或者直接写配置类代码
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
import java.net.InetAddress;
import java.net.UnknownHostException;
@Service
@Configuration
public class ConEsUtil {
@Bean
public TransportClient transportClient() throws UnknownHostException {
TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
.put("cluster.name", "elasticsearch")
.put("xpack.security.user", "elastic:changeme")
.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
return client;
}
}
3.实体类
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
import java.util.Date;
/**
* elasticsearch
* indexName :索引名字(对应mysql的数据库名字)
* type:类型(对应mysql的表名)
*/
@Data
@Document(indexName = "yankuang_technology", type = "test")
public class Test implements Serializable {
public static final String HELLO = "测试通过,biubiubiu...";
@Id
private Long id;
private String code;
private String name;
private String status;
/**
* 创建时间
*/
//2018-10-25T00:50:37.000Z
@JsonFormat(pattern ="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private Date create_at;
private String createAt;
/**
* 更新时间
*/
// @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
@JsonFormat (pattern ="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private Date update_at;
private String updateAt;
}
repository
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public interface TestElasticRepository extends ElasticsearchRepository<Test,Long> {
Test queryTestById(Long id);
List<Test> queryTestByStatusOrderByIdDesc(String status);
List<Test> queryAllByName(String name);
List<Test> queryTestByCodeNot(String name);
List<Test> queryTestByNameAndStatusNot(String name,String status);
}
接口
import com.yankuang.technology.model.Test;
import java.util.List;
public interface TestElasticService {
Test save(Test test);
String delete(Long id);
Test queryTestById(Long id);
List<Test> queryTestByStatusOrderByIdDesc(String status);
List<Test> queryAllByName(String name);
List<Test> queryTestByCodeNot(String name);
List<Test> queryTestByNameAndStatusNot(String name,String status);
List<Test> findAllTest01(String status) throws Exception;
List<Test> select(String name);
}
实现类
import com.google.common.collect.Lists;
import io.terminus.boot.rpc.common.annotation.RpcProvider;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @Author: xhh
* @Date: 2018-10-17 15:06
* @Version 1.0
*/
@RpcProvider
@Service
public class TestElasticServiceImpl implements TestElasticService {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@Autowired
TestElasticRepository testElasticRepository;
@Autowired
TransportClient transportClient;
public Test save(Test test){
Test test1 = testElasticRepository.save(test);
return test1;
}
@Override
public String delete(Long id) {
testElasticRepository.deleteById(id);
return "success";
}
public Test queryTestById(Long id){
return testElasticRepository.queryTestById(id);
}
@Override
public List<Test> queryTestByStatusOrderByIdDesc(String status) {
return testElasticRepository.queryTestByStatusOrderByIdDesc(status);
}
public List<Test> queryAllByName(String name){
return testElasticRepository.queryAllByName(name);
}
@Override
public List<Test> queryTestByCodeNot(String name) {
return testElasticRepository.queryTestByCodeNot(name);
}
@Override
public List<Test> queryTestByNameAndStatusNot(String name, String status) {
return testElasticRepository.queryTestByNameAndStatusNot(name,status);
}
public List<Test> findAllTest01(String status) throws Exception{
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//按标题进行查找
boolQueryBuilder.must(QueryBuilders.matchQuery("status", status));
//在这里输入索引名称和type类型
SearchResponse response = transportClient.prepareSearch("yankuang_technology").setTypes("test")
// 设置查询类型java
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
// 设置查询关键词
.setQuery(boolQueryBuilder)
// 设置查询数据的位置,分页用
.setFrom(1)
// 设置查询结果集的最大条数
.setSize(20)
// 设置是否按查询匹配度排序
.setExplain(true)
// 最后就是返回搜索响应信息
.get();
SearchHits searchHits = response.getHits();
List<Test> list = Lists.newArrayListWithCapacity(20);
for (SearchHit searchHit : searchHits) {
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
//获得id数据
Integer id = (Integer) sourceAsMap.get("id");
//获得code数据
String code = (String) sourceAsMap.get("code");
//获得name数据
String name = (String) sourceAsMap.get("name");
//获得create_at数据
String create_at1 = (String) sourceAsMap.get("create_at");
//获得update_at数据
String update_at1 = (String) sourceAsMap.get("update_at");
//把数据装入对象中
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");//需要转化成的时间格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式
Date create_at = sdf.parse(create_at1);
Date update_at = sdf.parse(update_at1);
long rightCreateTime = (long) (create_at.getTime() + 8 * 60 * 60 * 1000);//添加时间
long rightUpdateTime = (long) (update_at.getTime() + 8 * 60 * 60 * 1000);//添加时间
Test testDTO = new Test();
testDTO.setId(id.longValue());
testDTO.setCode(code);
testDTO.setName(name);
testDTO.setStatus(status);
String createAt = sdf1.format(rightCreateTime);
testDTO.setCreateAt(createAt);
String updateAt = sdf1.format(rightUpdateTime);
testDTO.setUpdateAt(updateAt);
list.add(testDTO);
}
return list;
}
public List<Test> select(String name) {
//创建builder
BoolQueryBuilder builder = QueryBuilders.boolQuery();
//builder下有must、should以及mustNot 相当于sql中的and、or以及not
//设置模糊搜索
builder.must(QueryBuilders.fuzzyQuery("name", name));
//设置性别必须为man
builder.must(new QueryStringQueryBuilder("1").field("status"));
//按照id从高到低
FieldSortBuilder sort = SortBuilders.fieldSort("id").order(SortOrder.DESC);
//设置分页(拿第一页,一页显示两条)
//注意!es的分页api是从第0页开始的(坑)
PageRequest page = new PageRequest(0, 20);
//构建查询
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//将搜索条件设置到构建中
nativeSearchQueryBuilder.withQuery(builder);
//将分页设置到构建中
nativeSearchQueryBuilder.withPageable(page);
//将排序设置到构建中
nativeSearchQueryBuilder.withSort(sort);
//生产NativeSearchQuery
NativeSearchQuery query = nativeSearchQueryBuilder.build();
//执行
Page<Test> search = testElasticRepository.search(query);
//获取总条数(前端分页需要使用)
int total = (int) search.getTotalElements();
//获取查询到的数据内容
List<Test> testList = search.getContent();
List<Test> testList1 = new ArrayList<Test>();
for (Test test : testList) {
//把数据装入对象中
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");//需要转化成的时间格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式
// Date create_at = sdf.parse(create_at1);
// Date update_at = sdf.parse(update_at1);
Date create_at = test.getCreate_at();
Date update_at = test.getUpdate_at();
long rightCreateTime = (long) (create_at.getTime() + 8 * 60 * 60 * 1000);//添加时间
long rightUpdateTime = (long) (update_at.getTime() + 8 * 60 * 60 * 1000);//添加时间
String createAt = sdf1.format(rightCreateTime);
test.setCreateAt(createAt);
String updateAt = sdf1.format(rightUpdateTime);
test.setUpdateAt(updateAt);
testList1.add(test);
}
//为了方便我就不显示总条数了,只在控制台给各位同学打印总条数看一下了
return testList1;
}
}
controller
import io.terminus.boot.rpc.common.annotation.RpcConsumer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.*;
@RestController
@RequestMapping("/v1/es")
public class TestESController {
@RpcConsumer
private TestElasticService testElastic;
/**
* 用es添加数据
* @return
*/
@GetMapping("add")
public Test save(){
Test test = new Test();
test.setId(Long.decode("112"));
test.setName("aa");
test.setCode("yy");
test.setStatus("1");
Test testSave = testElastic.save(test);
return testSave;
}
@GetMapping("delete")
public String delete(long id){
testElastic.delete(id);
return "success";
}
@GetMapping("update")
public Test update(long id,String name,String code,String status){
Test test = new Test();
test.setId(id);
test.setName(name);
test.setCode(code);
test.setStatus(status);
Test save = testElastic.save(test);
return save;
}
/**
* 查询全部test表数据
* @param
* @return
*/
@GetMapping("findAll")
public List<TestDTO> queryAll(String status){
List<Test> testList = testElastic.queryTestByStatusOrderByIdDesc(status);
List<TestDTO> testDTOList = new ArrayList<TestDTO>();
for(Test test:testList){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式
Date create_at = test.getCreate_at();
Date update_at = test.getUpdate_at();
TestDTO testDTO = new TestDTO();
testDTO.setId(test.getId());
testDTO.setCode(test.getCode());
testDTO.setName(test.getName());
testDTO.setStatus(test.getStatus());
String createAt = sdf.format(create_at);
testDTO.setCreateAt(createAt);
String updateAt = sdf.format(update_at);
testDTO.setUpdateAt(updateAt);
testDTOList.add(testDTO);
}
return testDTOList;
}
/**
* 通过id来查询ES中的数据
* @param id
* @return
*/
@GetMapping("queryById")
public TestDTO queryById(Long id) throws Exception{
Test test =testElastic.queryTestById(id);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//需要转化成的时间格式
Date create_at = test.getCreate_at();
Date update_at = test.getUpdate_at();
TestDTO testDTO = new TestDTO();
testDTO.setId(test.getId());
testDTO.setCode(test.getCode());
testDTO.setName(test.getName());
testDTO.setStatus(test.getStatus());
String createAt = sdf.format(create_at);
testDTO.setCreateAt(createAt);
String updateAt = sdf.format(update_at);
testDTO.setUpdateAt(updateAt);
return testDTO;
}
/**
* 通过name来查询ES中的数据
* @param name
* @return
*/
@GetMapping("queryByName")
public List<Test> queryByName(String name){
List<Test> testList =testElastic.queryAllByName(name);
return testList;
}
/**
* 通过code来查询ES中不包含此code的数据
* @param code
* @return
*/
@GetMapping("queryTestByCodeNot")
public List<Test> queryTestByCodeNot(String code){
List<Test> testList = testElastic.queryTestByCodeNot(code);
return testList;
}
/**
* 通过name和status来查询test,排查status为99的
* @param name
* @param status
* @return
*/
@GetMapping("queryTestByNameAndStatusNot")
public List<Test> queryTestByNameAndStatusNot(String name,String status){
List<Test> testList = testElastic.queryTestByNameAndStatusNot(name,status);
return testList;
}
//
@GetMapping("findAllTest01")
public List<Test> search01(String status) throws Exception{
List<Test> allTest01 = testElastic.findAllTest01(status);
return allTest01;
}
/**
* 查询全部test表数据 聚合查询
* @param
* @return
*/
@GetMapping("queryAll01")
public List<Test> queryAll01(String name){
List<Test> testDTOList = testElastic.select(name);
return testDTOList;
}
}
整合完毕
接下来需要依次启动,elasticsearch、logstash、kibana