基于spring-boot-starter-data-elasticsearch整合

开发环境:springboot版本:2.0.1,elasticSearch-5.6.8.jar版本:5.6.8,服务器部署ElasticSearch版本:6.3.2

1、application.properties

  1. spring.data.elasticsearch.cluster-name=elasticsearch
  2. spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
  3. spring.data.elasticsearch.repositories.enabled=true

2、pom.xml

  1. <!--spring整合elasticsearch包-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  5. </dependency>
  6. <!--实体工具包-->
  7. <dependency>
  8. <groupId>org.projectlombok</groupId>
  9. <artifactId>lombok</artifactId>
  10. </dependency>
  11. <!--集合工具包-->
  12. <dependency>
  13. <groupId>com.google.guava</groupId>
  14. <artifactId>guava</artifactId>
  15. <version>19.0</version>
  16. </dependency>

3、Notice实体

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. //indexName代表所以名称,type代表表名称
  5. @Document(indexName = "wantu_notice_info", type = "doc")
  6. public class Notice {
  7. //id
  8. @JsonProperty("auto_id")
  9. private Long id;
  10. //标题
  11. @JsonProperty("title")
  12. private String title;
  13. //公告标签
  14. @JsonProperty("exchange_mc")
  15. private String exchangeMc;
  16. //公告发布时间
  17. @JsonProperty("create_time")
  18. private String originCreateTime;
  19. //公告阅读数量
  20. @JsonProperty("read_count")
  21. private Integer readCount;
  22. }

4、NoticeRepository类

  1. import com.jincou.elasearch.domain.Notice;
  2. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. public interface NoticeRepository extends ElasticsearchRepository<Notice, Long> {
  6. }

5、NoticeController

  1. @RestController
  2. @RequestMapping("/api/v1/article")
  3. public class NoticeController {
  4. @Autowired
  5. private NoticeRepository nticeRepository;
  6. @GetMapping("save")
  7. public CommandResult<Void> save(long id, String title){
  8. Notice article = new Notice();
  9. article.setId(id);
  10. article.setReadCount(123);
  11. article.setTitle("springboot整合elasticsearch,这个是新版本 2018年");
  12. nticeRepository.save(article);
  13. return CommandResult.ofSucceed();
  14. }
  15. /**
  16. * @param title 搜索标题
  17. * @param pageable page = 第几页参数, value = 每页显示条数
  18. */
  19. @GetMapping("search")
  20. public CommandResult<List<Notice>> search(String title,@PageableDefault(page = 1, value = 10) Pageable pageable){
  21. //按标题进行搜索
  22. QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", title);
  23. //如果实体和数据的名称对应就会自动封装,pageable分页参数
  24. Iterable<Notice> listIt = nticeRepository.search(queryBuilder,pageable);
  25. //Iterable转list
  26. List<Notice> list= Lists.newArrayList(listIt);
  27. return CommandResult.ofSucceed(list);
  28. }
  29. }

6、查看运行结果

它会进行中文分词查询,然后安装相识度进行排序
【20200203】SpringBoot   Elasticsearch - 图1
总体步骤还是蛮清晰简单的,因为有spring-boot-starter-data-elasticsearch进行了整合,所以我们可以少敲很多代码。

基于TransportClient整合

首先明白:如果项目SpringBoot1.5.X以下的,那么elasticSearch.jar最高是2.4.4版本的,只有SpringBoot2.X+,elasticSearch.jar才是5.X+
如果你的SpringBoot是1.5.X以下,那你又想用elasticSearch.jar5.X+怎么办呢,那就不要用spring-boot-starter-data-elasticsearch,用原生的TransportClient实现即可。
这个相当于用原生的去使用elasticsearch,这里面并没有用到spring-boot-starter-data-elasticsearch相关jar包,因为我们公司的springBoot版本是1.5.9。
如果用spring-boot-starter-data-elasticsearch的话,那么elasticsearch版本最高只有2.4.4,这也太落后了,现在elasticsearch已经到6.3.2了,为了用更好的版本有两个方案:
1、提高springboot版本到2.X(不过不现实,船大难掉头),2、用原生的TransportClient实现。最终落地实现是通过TransportClient实现
把关键代码展示出来。

1、pom.xml

  1. <dependency>
  2. <groupId>org.elasticsearch</groupId>
  3. <artifactId>elasticsearch</artifactId>
  4. <version>5.6.8</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.elasticsearch.client</groupId>
  8. <artifactId>transport</artifactId>
  9. <version>5.6.8</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.logging.log4j</groupId>
  13. <artifactId>log4j-core</artifactId>
  14. <version>2.7</version>
  15. </dependency>

2、创建实体

  1. @Configuration
  2. public class ServerModule {
  3. @Bean
  4. public TransportClient transportClient() {
  5. Settings settings = Settings.builder().put("cluster.name", "biteniuniu").build();
  6. //我用6.3.2版本的时候这里一直报异常说找不到InetSocketTransportAddress类,这应该和jar有关,当我改成5.6.8就不报错了
  7. TransportClient client = new PreBuiltTransportClient(settings);//6.3.2这里TransportAddress代替InetSocketTransportAddress
  8. client.addTransportAddress(new InetSocketTransportAddress(
  9. new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300)));
  10. return client;
  11. }
  12. }

3、NoticeController类

  1. @RestController
  2. @RequestMapping("/api/v1/notice")
  3. public class NoticeController {
  4. @Autowired
  5. private TransportClient transportClient;
  6. /**
  7. *利用TransportClient实现搜索功能
  8. * @param title 搜索标题
  9. * @param page = 从第几条结果返回 | Integer(比如一次size=20,page=0,如果要显示下一页20条记录则需要size=20,page=20)这个和之前有点区别, size = 每页显示条数
  10. */
  11. @RequestMapping(value = "trsearch", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  12. public CommandResult<List<Notice>> search(@RequestParam(value = "title", defaultValue = "比特币")String title, @RequestParam(value = "page", defaultValue = "0")Integer page,
  13. @RequestParam(value = "size", defaultValue = "20")Integer size) {
  14. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  15. //按标题进行查找
  16. boolQueryBuilder.must(QueryBuilders.matchQuery("title", title));
  17. //在这里输入索引名称和type类型
  18. SearchResponse response = transportClient.prepareSearch("wantu_notice_info").setTypes("doc")
  19. // 设置查询类型java
  20. .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
  21. // 设置查询关键词
  22. .setQuery(boolQueryBuilder)
  23. // 设置查询数据的位置,分页用
  24. .setFrom(page)
  25. // 设置查询结果集的最大条数
  26. .setSize(size)
  27. // 设置是否按查询匹配度排序
  28. .setExplain(true)
  29. // 最后就是返回搜索响应信息
  30. .get();
  31. SearchHits searchHits = response.getHits();
  32. List<Notice> list = Lists.newArrayListWithCapacity(size);
  33. for (SearchHit searchHit : searchHits) {
  34. Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
  35. //获得titie数据
  36. String titles = (String) sourceAsMap.get("title");
  37. //获得阅读量数据
  38. Integer readCount = (Integer) sourceAsMap.get("read_count");
  39. //把数据装入对象中
  40. Notice notice=new Notice();
  41. notice.setTitle(titles);
  42. notice.setReadCount(readCount);
  43. list.add(notice);
  44. }
  45. return CommandResult.ofSucceed(list);
  46. }
  47. }

4、运行结果
【20200203】SpringBoot   Elasticsearch - 图2

总结下:第一种整合相对简单很多,因为本身封装很多东西,比如分页,封装数据等。第二种的话可以在不用spring的情况下使用它。