ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch
时间:2022-07-24
本文章向大家介绍ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
ElasticSearch学习笔记(5)——SpringBoot整合ElasticSearch
本节主要介绍SpringBoot与ElasticSearch的整合,并实现简单的CRUD。
-
概述
SpringBoot与ElasticSearch的整合主要有两种方式:
- Spring将ElasticSearch的操作也封装到了Spring Data项目中,dao接口继承 ElasticsearchRepository 即可;
- 使用Spring提供的ElasticsearchTemplate模板类,在Service类中直接注入ElasticsearchTemplate对象即可。
-
具体操作
- 引入spring-boot-starter-data-elasticsearch依赖
<!--ElasticSearch依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
spring:
data:
elasticsearch:
cluster-name: elasticsearch #集群名称,默认即为 elasticsearch
cluster-nodes: 127.0.0.1:9300 #配置es节点信息,多个节点用逗号分隔。如果没有指定,则启动ClientNode。注:ES中API的端口号要写TransportService服务的端口,默认为9300
/**
* @Auther: ZhangShenao
* @Date: 2018/8/24 10:29
* @Description:Book实体
* 加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词
*/
@Document(indexName = "product", type = "book")
@Getter
@Setter
public class Book {
@Id
String id;
String name;
String message;
String type;
}
/**
* @Auther: ZhangShenao
* @Date: 2018/8/24 10:32
* @Description:Book Dao接口,继承ElasticsearchRepository实现EalsticSearch操作
*/
public interface BookDao extends ElasticsearchRepository<Book,String> {
}
/**
* @Auther: ZhangShenao
* @Date: 2018/8/24 10:36
* @Description:直接使用ElasticsearchRepository操作ElasticSearch
*/
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private BookDao bookDao;
/**
* 根据id查询
*/
@GetMapping("/get/{id}")
public BookEntity getBookById(@PathVariable String id) {
return bookDao.findOne(id);
}
/**
* 全文检索
*/
@GetMapping("/select/{search}")
public List<BookEntity> search(@PathVariable String search) {
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(search);
Iterable<BookEntity> searchResult = bookDao.search(builder);
if (searchResult == null){
return Collections.emptyList();
}
Iterator<BookEntity> iterator = searchResult.iterator();
List<BookEntity> books = new ArrayList<>();
while (iterator.hasNext()) {
books.add(iterator.next());
}
return books;
}
/**
* 分页查询
*/
@GetMapping("/{page}/{size}/{search}")
public List<BookEntity> searchByPage(@PathVariable Integer page, @PathVariable Integer size, @PathVariable String search) {
// 分页参数
Pageable pageable = new PageRequest(page, size);
// 分数,并自动按分排序
FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery()
.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("name", search)),
ScoreFunctionBuilders.weightFactorFunction(1000)) // 权重:name 1000分
.add(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("message", search)),
ScoreFunctionBuilders.weightFactorFunction(100)); // 权重:message 100分
// 分数、分页
SearchQuery searchQuery = new NativeSearchQueryBuilder().withPageable(pageable)
.withQuery(functionScoreQueryBuilder).build();
Page<BookEntity> searchPageResults = bookDao.search(searchQuery);
return searchPageResults.getContent();
}
/**
* 添加
*/
@PostMapping("/insert")
public BookEntity insertBook(BookEntity bookEntity) {
bookDao.save(bookEntity);
return bookEntity;
}
/**
* 删除
*/
@DeleteMapping("/delete/{id}")
public BookEntity deleteById(@PathVariable String id) {
BookEntity bookEntity = bookDao.findOne(id);
bookDao.delete(id);
return bookEntity;
}
/**
* 修改
* @param bookEntity
* @return
*/
@PutMapping("/update")
public BookEntity updateBook(BookEntity bookEntity) {
bookDao.save(bookEntity);
return bookEntity;
}
/**
* @Auther: ZhangShenao
* @Date: 2018/8/24 10:46
* @Description:使用ElasticsearchTemplate模板类操作ElasticSearch
*/
@RestController
@RequestMapping("/book/template")
public class BookControllerWithTemplate {
@Autowired
ElasticsearchTemplate elasticsearchTemplate;
/**
* 查询所有
*/
@GetMapping("/find_all")
public List<Map<String, Object>> findAll() {
Client client = elasticsearchTemplate.getClient();
SearchRequestBuilder srb = client.prepareSearch("product").setTypes("book");
SearchResponse sr = srb.setQuery(QueryBuilders.matchAllQuery()).execute().actionGet(); // 查询所有
SearchHits hits = sr.getHits();
List<Map<String, Object>> datas = new ArrayList<>();
for (SearchHit hit : hits) {
Map<String, Object> source = hit.getSource();
datas.add(source);
System.out.println(hit.getSourceAsString());
}
return datas;
}
}
- 总结 综上,可以看到,使用Spring Data框架或者ElasticsearchTemplate可以十分方便的操作ElasticSearch,简化了原生Restful API的复杂性。
- 日志分析实战之清洗日志小实例5:实现获取不能访问url
- CentOS安装Redis、PHPredis扩展
- 日志分析实战之清洗日志小实例4:统计网站相关信息
- PHP-数组排序
- hdu---(3555)Bomb(数位dp(入门))
- PHP-循环
- 日志分析实战之清洗日志小实例3:如何在spark shell中导入自定义包
- PHP-函数
- hdu----(5045)Contest(数位dp)
- hdu----(5053)the Sum of Cube(签到题,水体)
- RHEL构建DNS服务器-多区域
- hdu----(5050)Divided Land(二进制求最大公约数)
- 日志分析实战之清洗日志小实例1:使用spark&Scala分析Apache日志
- RHEL构建DNS服务器-单区域
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释