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

    技术2022-07-11  86

    版本选择

    因为手里的项目是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.

    Processed: 0.011, SQL: 9