Spring boot 操作 elasticsearch 趟坑搭建demo,单纯做个记录。

版本选择

因为手里的项目是Spring boot 1.5.X的,所以能选择的es版本就需要去对应寻找,我本地搭建的版本是2.4.2版本的。对应的版本选择可以看下图在这里插入图片描述

环境准备

需要准备elasticsearch服务器,以及对应的可视化的kibana,方便观察操作是否成功。和我版本相似的可以看一下这个网站:link,从上面可以找到对应的工具,还有对应讲解。

demo搭建

配置

在Spring boot 项目的基础上,需要引入对应的依赖。
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
这里我本来的引入的是
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
但是调用个别方法时就会出现jackson版本问题,所以我就直接引入对应jackson依赖了。
然后再yml配置文件中需要添加
data: elasticsearch: cluster-nodes: 127.0.0.1:9300
因为我是本机搭建,所以IP就直接放1270.0.1就可以了。

代码

实体类

首先编写对应的实体类:
`import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.io.Serializable;

/**

  • @author
  • @despriction
  • @date 2020/7/1 0030
    */

@Document(indexName = “test”,type = “category”)
public class Category implements Serializable {
@Id
private int id;
@Field(type = FieldType.String )
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}`
其中的 @Document注解就表明了要连接到 ElasticSearch 的哪个索引和哪个 type 上;@Id注解就表明该字段是主键,是会和es中_id匹配的。

Dao
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import thirdquery.domain.workspace.pojo.Category;

/**
 * @author 
 * @despriction
 * @date 2020/7/1 0030
 */
public interface CategoryDAO extends ElasticsearchRepository<Category,Integer> {

}

这个只要继承了ElasticsearchRepository就可以了,需要注意的是ElasticsearchRepository后面的泛型,第一的值对应的是操作的对象类型,也就是对应实体类,第二个值是操作对象的主键类型,就是实体类中主键的类型。写好以后就可以使用了。

Controller
import com.thirdquery.dao.CategoryDAO;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import thirdquery.api.CategoryApi;
import thirdquery.domain.workspace.pojo.Category;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author 
 * @despriction
 * @date 2020/7/1 0030
 */
@RestController
public class CategoryController implements CategoryApi {
    @Autowired
    CategoryDAO categoryDAO;

    /**
     * 添加/更新对应数据到es
     * @param c
     */
    @Override
    public void addCategory(@RequestBody Category c) {
        int id = currentTime();
        c.setId(id);
        categoryDAO.save(c);
    }

    /**
     * 获取当前系统时间戳
     * @return
     */
    private int currentTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("MMddHHmmss");
        String time= sdf.format(new Date());
        return Integer.parseInt(time);
    }

    /**
     * 从es删除某条信息
     * @param c
     */
    @Override
    public void  deleteCategory(@RequestBody Category c)  {
        categoryDAO.delete(c);
    }

    /**
     * 添加/更新对应数据到es
     * @param c
     */
    @Override
    public void updateCategory( @RequestBody Category c)  {
        categoryDAO.save(c);
    }

    /**
     * 根据id查询数据
     * @param id
     * @return
     */
    @Override
    public Category ediitCategory(@PathVariable String id) {
        int ids = Integer.parseInt(id);
        Category c= categoryDAO.findOne(ids);
       return c;
    }

    /**
     * 从es查询所有数据
     * @return
     */
    @Override
    public  List<Category> findAll(){
        Iterable<Category> iterable = categoryDAO.findAll();
        List<Category> list = new ArrayList<>();
        iterable.forEach(e->list.add(e));
        return list;

    }

    /**
     * 根据关键字查询数据
     * @param name
     * @return
     */
    @Override
    public List<Category> getByName(@PathVariable String name){
        List<Category> list = new ArrayList<>();
        //当我们要用全文匹配的时候,就需要用到MatchQueryBuilder。
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("name", name);
        Iterable<Category> iterable = categoryDAO.search(matchQueryBuilder);
        iterable.forEach(e->list.add(e));
        return list;
    }
}

这个controller 实现封装的接口

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import thirdquery.domain.workspace.pojo.Category;

import java.util.List;

/**
 * @author 
 * @despriction
 * @date 2020/7/1 0001
 */
public interface CategoryApi {
    @RequestMapping("/addCategory")
    void addCategory( @RequestBody Category c);

    @RequestMapping("/deleteCategory")
    void  deleteCategory(@RequestBody Category c);

    @RequestMapping("/updateCategory")
    void updateCategory(@RequestBody Category c);

    @RequestMapping("/editCategory/{id}")
    @ResponseBody
    Category ediitCategory(@PathVariable String id);

    @RequestMapping("/findAll")
    Iterable<Category> findAll();

    @RequestMapping("/getByName/{name}")
    List<Category> getByName(@PathVariable String name);
}

这块就没有什么好说的,都是直接使用ElasticsearchRepository封装好的方法进行操作。

测试

使用postman 调用接口,再通过kibana工具查看就可以了。kibana工具用法在这里面也有讲解。link.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值