最近在项目中因为应用到es,所以打算学es致用
当一张表中的数据量是千万级别以后,那么无论它是如何来拆分都对它的性能没有多大的提升,这个时候es就起到作用了,es会在每个字段上面都建立一个索引,用来提升查询效率
这篇博客我是采用spring-boot-starter-data-elasticsearch来实现的
在原来的基础之上导入spring-data-elasticsearch包依赖:
<!--es中的依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
在配置文件标明es数据库中地址以及端口号
#es数据库中的配置位置
elasticsearch:
rest:
uris: http://localhost:9200
自定义一个document,这个document中可以有自定义的字段
/**
* index:索引可以理解为数据库 database其中名称必须要以indexName来称呼
*document:简单的理解为mysql关系型数据库中的表
*/
@Document(indexName = "article")
@Data
public class Article {
@Id
private String id;
private String title;
private String content;
private Integer userId;
private Integer createTime;
}
自定义一个能够操作es数据中的接口
这个接口必须要继承elasticsearchRepository这个类
*/
@Repository
public interface ArticleRepository extends ElasticsearchRepository<Article, String> {
在自定义的controller层中实现对es数据中的操作
esController
/**
* 对文章类中的内容进行校验
增操作
* @param article
* @return
*/
@PostMapping("saveToEs")
public String save(@RequestBody Article article){
//数据新增或者是更新
String result = verifySaveForm(article);
if (!StringUtils.isEmpty(result)){
return "文章中的字段有一些是null值";
}
if (StringUtils.isEmpty(article.getId())){
article.setCreateTime(12);
}
//将文章存储进仓库中去,注意点就是es在存储数据时,它的返回值是存储的document
Article a = articleRespository.save(article);
return "es中的数据已经保存成功";
}
/**
* 根据id来删除数据(这个方法是接口中自定义的删除方法,可以在此基础之上自定义一个操作方法)
* @param id
* @return
*/
@DeleteMapping("remove/{id}")
public String delete(@PathVariable String id){
//根据id删除
articleRespository.deleteById(id);
return "es中的数据已经删除";
}
/**
* 查询出所有的数据(也是接口中的固定死的方法)
* @return
*/
@RequestMapping(value = "queryAllData")
public String queryAll(){
Iterable<Article> all = articleRespository.findAll();
Iterator<Article> iterator = all.iterator();
while(iterator.hasNext()){
Article next = iterator.next();
log.info("------------->查询出的文章数据为:{}", next);
}
return "查询出所有的数据结果";
}
/**
* 对es中的数据进行分页查询
* @param currentPage
* @param limit
* @return
*/
@GetMapping("list")
public String list(@RequestParam Integer currentPage, @RequestParam Integer limit){
if (currentPage == null || currentPage < 0 || limit == null || limit <= 0){
return "请输入合法的分页参数";
}
//分页列表查询
//这里采用ElasticSearchRestTemplate或ElasticsearchOperations来进行分页
NativeSearchQuery query = new NativeSearchQuery(new BoolQueryBuilder());
query.setPageable(PageRequest.of(currentPage, limit));
//方法一:
SearchHits<Article> searchHits = elasticsearchRestTemplate.search(query, Article.class);
//方法二:
// SearchHits<Article> search = elasticsearchOperations.search(query, Article.class);
List<Article> articles = searchHits.getSearchHits().stream().map(SearchHit::getContent).collect(Collectors.toList());
//将数据存储进map中去
Map<String, Object> map = new HashMap<>();
map.put("count", searchHits.getTotalHits());
map.put("articles", articles);
return JSON.toJSONString(map);
}
https://elasticsearchjava-api.readthedocs.io/en/latest/index.html es上面的中文文档