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