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
相关文章推荐
- SpringBoot整合ElasticSearch
- 5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch) ---- good
- docker+springboot+elasticsearch+kibana+elasticsearch-head整合(详细说明 ,看这一篇就够了)
- 【ElasticSearch】---SpringBoot整合ElasticSearch
- SpringBoot整合ElasticSearch实现多版本的兼容
- SpringBoot(2.0.4.RELEASE)+Elasticsearch(6.2.4)+Gradle简单整合
- SpringBoot整合ElasticSearch
- ElasticSearch整合springboot实战
- SpringBoot2.0 + Elasticsearch 6.x(5.x) 整合 POM 文件
- spring boot 1.5.19整合elasticsearch时出现的问题
- SpringBoot整合Elasticsearch并实现CRUD操作
- Spring Boot系列(十)Spring Boot整合Elasticsearch全文搜索引擎
- Spring Boot与Kotlin 整合全文搜索引擎Elasticsearch
- Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询
- Spring Boot整合Elasticsearch实现全文搜索引擎案例解析
- 【spring boot】2.0 整合 elasticsearch NoNodeAvailableException 解决方案
- 初识elasticsearch_2(查询和整合springboot)
- SpringBoot整合Elasticsearch
- SpringBoot整合ElasticSearch的示例代码
- Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询