您的位置:首页 > 编程语言 > Java开发

springboot整合elasticsearch

2019-02-26 14:12 369 查看

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
24000
);

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: