spring整合Elasticsearch

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: spring整合Elasticsearch

• 引入依赖


- spring-boot-starter-data-elasticsearch

1.    <dependency>
2.      <groupId>org.springframework.boot</groupId>
3.      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
4.    </dependency>

• 配置Elasticsearch


解决netty启动冲突问题

1. @PostConstruct
2. public void init() {
3. // 解决netty启动冲突问题
4. // see Netty4Utils.setAvailableProcessors()
5.         System.setProperty("es.set.netty.runtime.available.processors", "false");
6.     }

- cluster-name、cluster-nodes

1. # ElasticsearchProperties
2. spring.data.elasticsearch.cluster-name=nowcoder
3. spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

• Spring Data Elasticsearch


Elasticsearch有两种方式可以调用:

- ElasticsearchTemplate

案例:

1. 
2. @Test
3. public void testSearchByTemplate() {
4. SearchQuery searchQuery = new NativeSearchQueryBuilder()
5.                 .withQuery(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
6.                 .withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
7.                 .withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
8.                 .withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
9.                 .withPageable(PageRequest.of(0, 10))
10.                 .withHighlightFields(
11. new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
12. new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
13.                 ).build();
14. 
15.         Page<DiscussPost> page = elasticTemplate.queryForPage(searchQuery, DiscussPost.class, new SearchResultMapper() {
16. @Override
17. public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {
18. SearchHits hits = response.getHits();
19. if (hits.getTotalHits() <= 0) {
20. return null;
21.                 }
22. 
23.                 List<DiscussPost> list = new ArrayList<>();
24. for (SearchHit hit : hits) {
25. DiscussPost post = new DiscussPost();
26. 
27. String id = hit.getSourceAsMap().get("id").toString();
28.                     post.setId(Integer.valueOf(id));
29. 
30. String userId = hit.getSourceAsMap().get("userId").toString();
31.                     post.setUserId(Integer.valueOf(userId));
32. 
33. String title = hit.getSourceAsMap().get("title").toString();
34.                     post.setTitle(title);
35. 
36. String content = hit.getSourceAsMap().get("content").toString();
37.                     post.setContent(content);
38. 
39. String status = hit.getSourceAsMap().get("status").toString();
40.                     post.setStatus(Integer.valueOf(status));
41. 
42. String createTime = hit.getSourceAsMap().get("createTime").toString();
43.                     post.setCreateTime(new Date(Long.valueOf(createTime)));
44. 
45. String commentCount = hit.getSourceAsMap().get("commentCount").toString();
46.                     post.setCommentCount(Integer.valueOf(commentCount));
47. 
48. // 处理高亮显示的结果
49. HighlightField titleField = hit.getHighlightFields().get("title");
50. if (titleField != null) {
51.                         post.setTitle(titleField.getFragments()[0].toString());
52.                     }
53. 
54. HighlightField contentField = hit.getHighlightFields().get("content");
55. if (contentField != null) {
56.                         post.setContent(contentField.getFragments()[0].toString());
57.                     }
58. 
59.                     list.add(post);
60.                 }
61. 
62. return new AggregatedPageImpl(list, pageable,
63.                         hits.getTotalHits(), response.getAggregations(), response.getScrollId(), hits.getMaxScore());
64.             }
65.         });
66. 
67.         System.out.println(page.getTotalElements());
68.         System.out.println(page.getTotalPages());
69.         System.out.println(page.getNumber());
70.         System.out.println(page.getSize());
71. for (DiscussPost post : page) {
72.             System.out.println(post);
73.         }
74.     }

- ElasticsearchRepository

首先写一个接口扩展 ElasticsearchRepository

1. @Repository
2. public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost, Integer> {
3. 
4. }

这里我们可以直接调用相关接口实现增删改查的功能

案例:

1. @Autowired
2. private DiscussPostRepository discussRepository;    
3. 
4. @Test
5. public void testInsert() {
6. for(int i = 109; i <= 280; i++)
7.         discussRepository.save(discussMapper.selectDiscussPostById(i));
8.     }
9. 
10. @Test
11. public void testInsertList() {
12.         discussRepository.saveAll(discussMapper.selectDiscussPosts(101, 0, 100, 0));
13.         discussRepository.saveAll(discussMapper.selectDiscussPosts(102, 0, 100, 0));
14.         discussRepository.saveAll(discussMapper.selectDiscussPosts(103, 0, 100, 0));
15.         discussRepository.saveAll(discussMapper.selectDiscussPosts(111, 0, 100, 0));
16.         discussRepository.saveAll(discussMapper.selectDiscussPosts(112, 0, 100, 0));
17.         discussRepository.saveAll(discussMapper.selectDiscussPosts(131, 0, 100, 0));
18.         discussRepository.saveAll(discussMapper.selectDiscussPosts(132, 0, 100, 0));
19.         discussRepository.saveAll(discussMapper.selectDiscussPosts(133, 0, 100, 0));
20.         discussRepository.saveAll(discussMapper.selectDiscussPosts(134, 0, 100, 0));
21.     }
22. 
23. @Test
24. public void testUpdate() {
25. DiscussPost post = discussMapper.selectDiscussPostById(231);
26.         post.setContent("我是新人,使劲灌水.");
27.         discussRepository.save(post);
28.     }
29. 
30. @Test
31. public void testDelete() {
32.          discussRepository.deleteById(319);
33.          discussRepository.deleteById(320);
34.          discussRepository.deleteById(321);
35. //        discussRepository.deleteAll();
36.     }
37. 
38. @Test
39. public void testSearchByRepository() {
40. SearchQuery searchQuery = new NativeSearchQueryBuilder()
41.                 .withQuery(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
42.                 .withSort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
43.                 .withSort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
44.                 .withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
45.                 .withPageable(PageRequest.of(0, 10))
46.                 .withHighlightFields(
47. new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
48. new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>")
49.                 ).build();
50. 
51. // elasticTemplate.queryForPage(searchQuery, class, SearchResultMapper)
52. // 底层获取得到了高亮显示的值, 但是没有返回.
53. 
54.         Page<DiscussPost> page = discussRepository.search(searchQuery);
55.         System.out.println(page.getTotalElements());
56.         System.out.println(page.getTotalPages());
57.         System.out.println(page.getNumber());
58.         System.out.println(page.getSize());
59. for (DiscussPost post : page) {
60.             System.out.println(post);
61.         }
62.     }
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
6月前
|
存储 搜索推荐 Java
|
6月前
|
监控 Java Docker
从零开始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合
从零开始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合
1264 0
|
5月前
|
XML 搜索推荐 Java
Elasticsearch集成到Spring Boot项目
将Elasticsearch集成到Spring Boot项目中,可以方便地实现数据的搜索、分析等功能。
247 2
|
6月前
|
SQL Java 关系型数据库
spring data elasticsearch 打印sql(DSL)语句
spring data elasticsearch 打印sql(DSL)语句
444 0
|
4月前
|
Java 索引 Spring
教程:Spring Boot中集成Elasticsearch的步骤
教程:Spring Boot中集成Elasticsearch的步骤
|
6月前
|
存储 Java 网络架构
Spring Data Elasticsearch基础入门详解
Spring Data Elasticsearch基础入门详解
323 0
|
6月前
|
前端开发 JavaScript
elasticsearch 实现搜索关键字的高亮显示(spring-data-elasticsearch)
elasticsearch 实现搜索关键字的高亮显示(spring-data-elasticsearch)
787 0
|
8天前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
23 5
|
1月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
117 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo