当前位置:   article > 正文

elasticsearch(ES)在SpringBoot中的基本使用_springboot + es

springboot + es

一、引言

 ES是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于Restful web接口。它是一种企业级别的搜索引擎,本身使用Java开发的,类似的搜索引擎还有Apache Solr 也是基于Lucene.

基本概念

ES 是面向文档类型的数据库,一条数据在这里就是一条文档(documnet),用JSON作为文档序列化得格式,为便于理解,我们可将ES的一些基本概念和典型的关系型数据库MySQL作对比

ES的概念和MySQL作对比
ES概念MySQL概念
index(索引)database(数据库)
type(类型)table(表)
document(一条文档)row(一行数据)
field(字段)col(列,字段)

ES最核心的功能是提供强大的搜索功能,后面会继续深入探讨,本文首先作为入门,介绍如何在我们的springboot项目中引入ES搜索引擎,并做简单的使用。

二、ES在SpringBoot中的应用

  1)首先在pom文件中引入spring data ES的依赖包

  1. <!--引用elasticsearch(ES)jar包-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  5. </dependency>

2)然后我们新建一个book类

  1. @Data
  2. @Document(indexName = "es_book_index",type = "es_book_type")
  3. public class Book {
  4. @Id
  5. @Field(type = FieldType.Keyword)
  6. private String id;
  7. @Field(type = FieldType.Keyword)
  8. private String name;
  9. @Field(type = FieldType.Integer)
  10. private Integer pageNum;
  11. @Field(type = FieldType.Double)
  12. private Double price;
  13. @Field(type = FieldType.Text)
  14. private String introduction;
  15. @Field(type = FieldType.Date)
  16. private Date date;
  17. }

这个类上的注解见名知意,@Document 表征以这个实体类建立一个ES索引,名字为es_book_index, 类型为es_book_type,字段上的注解@ID,分别表征该字段为document的ID,然后@Field指定说明该字段的特定类型

3)然后我们新建EsBookRepository 接口继承 elasticsearchRepository,就可以集成我们日常开发的常用的增删改查的功能,其次,在该repository中,我们还可以按照JPA的命名约定写出一系列的方法而不需要操作语句,非常方便。

  1. @Repository
  2. public interface EsBookRepository extends ElasticsearchRepository<Book,String> {
  3. // 根据书名字查询
  4. List<Book> queryByName(String name);
  5. // 根据相应价格统计书本的数量
  6. long countBooksByPrice(Integer price);
  7. // 根据名字删除
  8. void deleteByName(String name);
  9. }

4)另外我们也可以使用search()方法,然后构建查询方法具体示例为:

  1. @Service
  2. public class BookService {
  3. @Autowired
  4. private EsBookRepository bookRepository;
  5. // 完全匹配项查询
  6. public List<Book> findBookByTermQuery(Integer pageNum){
  7. TermQueryBuilder termQuery = QueryBuilders.termQuery("pageNum",pageNum);
  8. Iterable<Book> bookIterable = bookRepository.search(termQuery);
  9. Iterator<Book> iterator = bookIterable.iterator();
  10. // 遍历该迭代器,取出相应结果
  11. List<Book> books = new ArrayList<>();
  12. while(iterator.hasNext()){
  13. books.add(iterator.next());
  14. }
  15. return books;
  16. }
  17. // 模糊匹配查询
  18. public List<Book> findBooksLikeByMatchQuery(String word){
  19. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("introduction", word);
  20. Iterable<Book> bookIterable = bookRepository.search(matchQueryBuilder);
  21. Iterator<Book> iterator = bookIterable.iterator();
  22. // 遍历该迭代器,取出相应结果
  23. List<Book> books = new ArrayList<>();
  24. while(iterator.hasNext()){
  25. books.add(iterator.next());
  26. }
  27. return books;
  28. }
  29. // 范围查询
  30. public List<Book> findBooksLikeByRangeQuery(Integer minPageNum,Integer maxPageNum){
  31. RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("pageNum").gte(minPageNum).lte(maxPageNum);
  32. Iterable<Book> bookIterable = bookRepository.search(rangeQueryBuilder);
  33. Iterator<Book> iterator = bookIterable.iterator();
  34. // 遍历该迭代器,取出相应结果
  35. List<Book> books = new ArrayList<>();
  36. while(iterator.hasNext()){
  37. books.add(iterator.next());
  38. }
  39. return books;
  40. }

5)最后我们建立controller层,模拟向该es_book_index中插入一些数据,然后使用之前构建的查询方法都能得到相应的结果

  1. @RestController
  2. @RequestMapping(value = "/testBookEs")
  3. @Api(description = "ES book实体类测试")
  4. public class TestBookEsController {
  5. @Autowired
  6. private EsBookRepository bookRepository;
  7. @Autowired
  8. private BookService bookService;
  9. @ApiOperation(value = "批量保存book数据")
  10. @RequestMapping(value = "/batchSave", method = RequestMethod.PUT)
  11. public String testSaveBook(@RequestParam Integer n) {
  12. Random random = new Random();
  13. String[] names = {"三国志", "三国演义", "三国", "红楼梦","红楼","西游记","三国演义"};
  14. Integer[] pageNums = {100,200,300,400,500};
  15. String[] introductions = {"这是一本很好的故事","这里面有非常动人的故事","孙悟空三大白骨精"};
  16. Double[] prices = {38.6,35.8,50.9,40.7};
  17. Date date = new Date();
  18. Date[] dates = {date, DateUtil.getOneDayOnset(-2,date), DateUtil.getOneDayOnset(1,date),DateUtil.getOneDayOnset(2,date)};
  19. for (int i = 0; i < n; i++) {
  20. Book b = new Book();
  21. String id = UUID.randomUUID().toString().replace("_","").substring(0,10);
  22. b.setId(id);
  23. b.setName(names[random.nextInt(names.length)]);
  24. b.setPageNum(pageNums[random.nextInt(pageNums.length)]);
  25. b.setPrice(prices[random.nextInt(prices.length)]);
  26. b.setIntroduction(introductions[random.nextInt(introductions.length)]);
  27. b.setCreateTime(dates[random.nextInt(dates.length)]);
  28. bookRepository.save(b);
  29. }
  30. return "ok";
  31. }
  32. @ApiOperation(value = "单项查询")
  33. @RequestMapping(value = "/findBookByTermQuery", method = RequestMethod.GET)
  34. public List<Book> findBookByTermQuery(@RequestParam Integer pageNum){
  35. List<Book> bookByTermQuery = bookService.findBookByTermQuery(pageNum);
  36. return bookByTermQuery;
  37. }
  38. @ApiOperation(value = "模糊查询")
  39. @RequestMapping(value = "/findBooksLikeByMatchQuery", method = RequestMethod.GET)
  40. public List<Book> findBooksLikeByMatchQuery(@RequestParam String word){
  41. List<Book> books = bookService.findBooksLikeByMatchQuery(word);
  42. return books;
  43. }
  44. @ApiOperation(value = "范围查询")
  45. @RequestMapping(value = "/findBooksLikeByRangeQuery", method = RequestMethod.GET)
  46. public List<Book> findBooksLikeByRangeQuery(@RequestParam Integer min, @RequestParam Integer max){
  47. List<Book> books = bookService.findBooksLikeByRangeQuery(min,max);
  48. return books;
  49. }
  50. @ApiOperation(value = "JPA-method-根据价格查询")
  51. @RequestMapping(value = "/countBooksByPrice", method = RequestMethod.GET)
  52. public long countBooksByPrice(@RequestParam Double price){
  53. long count = bookRepository.countBooksByPrice(price);
  54. return count;
  55. }
  56. @ApiOperation(value = "JPA-method-根据名字查询")
  57. @RequestMapping(value = "/queryByName", method = RequestMethod.GET)
  58. public List<Book> queryByName(@RequestParam String name){
  59. List<Book> books = bookRepository.queryByName(name);
  60. return books;
  61. }
  62. @ApiOperation(value = "JPA-method-根据名字删除")
  63. @RequestMapping(value = "/deleteByName", method = RequestMethod.DELETE)
  64. public void deleteByName(@RequestParam String name){
  65. bookRepository.deleteByName(name);
  66. }
  67. }

三、小结

本篇主要简单介绍了如何在springboot项目中使用ES这款强大的搜索引擎,并做了增删改查的示例,对一些常用简单的方法统计等有涉及到。ES的深入分析后续将会进一步介绍,包括ES提供的强大搜索统计聚合等功能后续将进一步探讨。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/936256
推荐阅读
相关标签
  

闽ICP备14008679号