springboot整合elasticsearch

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值