0


ES在SpringBoot集成使用

1. 在Docker中安装Elasticsearch

这里不了解docker甚至还没安装虚拟机的小伙伴可以去黑马的视频下找到资源,去下一个虚拟机

这里就不对ES进行过多介绍了,具体的效果去b站看看叭,这里直接速成使用

  • 安装ES并启动
  1. docker pull elasticsearch <ES版本>
  2. egdocker pull elasticsearch 7.7.0
  1. docker run --name elasticsearch //启动容器并命名
  2. -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" 设置初始堆和最大堆内存
  3. -e "discovery.type=single-node" //配置ES以单节点模式运行,不集群
  4. -p 9200:9200 //-p 用于端口映射,格式为<宿主机端口>:<容器端口>
  5. -p 9300:9300 elasticsearch:7.7.0

也可以考虑用docker-compose一步到位进行安装

docker-compose 安装部署ElasticSearch 和 Kibana - 06 - 博客园 (cnblogs.com)

Kibana是ES的一个图形化操作工具,也可以使用es-head,这里我本人使用的是es-head,因此我讲的也是es-head安装

docker run后,浏览器访问ip:9200,如果显示以下内容即表示安装成功

然后安装ES-head

  1. #拉取镜像
  2. docker pull mobz/elasticsearch-head:5
  3. #创建容器
  4. docker create --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
  5. #启动容器
  6. docker start elasticsearch-head
  7. or
  8. docker start 容器id docker ps -a 查看容器id
  9. //-a可以查看到未启动的容器

安装后启动,浏览器打开ip:9100

这里直接输入ES地址是无法连接的,需要进行跨域配置,因为是前后端分离的

  1. 修改docker中elasticsearch的elasticsearch.yml文件
  1. docker exec -it elasticsearch /bin/bash (进不去使用容器id进入)
  2. vi config/elasticsearch.yml

在最下面加入两行

  1. http.cors.enabled: true
  2. http.cors.allow-origin: "*"

按i进入插入模式,就可以编辑了,编辑完按ESC退出编辑模式,输入:,进入底行模式,再输入wq强制保存并退出,这些命令不懂的话去学下liunx基础

好了之后退出并重启服务就可以运行了

然后就可以了,至于分词器的话,根据业务需求来叭,也不是必须安装

Docker上安装部署Elasticsearch(ES)详细教程_docker安装es-CSDN博客想安装Kibana和ik的也可以看这篇文章

2. 在SpringBoot中使用ES

2.1. Spring Data Elasticsearch方式

  1. 导入依赖
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4. </dependency>
  1. 在配置文件中加入
  1. server:
  2. port: 8000 //可以改端口
  3. spring:
  4. elasticsearch:
  5. rest:
  6. uris:
  7. - http://localhost:9200 //es容器的地址,ip要换成虚拟机ip
  1. 在java中编写实体对象,和ES进行映射
  1. @Data //lombok的注解,要导入lombok
  2. //定义索引,7以上的版本去掉了type属性
  3. @Document(indexName = "goodsorder", shards = 1, replicas = 1)
  4. @AllArgsConstructor
  5. @NoArgsConstructor
  6. public class OrderDoc implements Serializable {
  7. @Id
  8. @Field(type = FieldType.Keyword)
  9. private String id;
  10. @Field(type = FieldType.Long)
  11. private Long orderNo;
  12. @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
  13. private String title;
  14. //用来封装高亮的结果
  15. private Map<String, List<String>> highlights;
  16. public OrderDoc(String id, Long orderNo ,String title){
  17. this.id = id;
  18. this.orderNo = orderNo;
  19. this.title =title;
  20. }
  21. }
  1. 编写Repository接口
  1. @Repository
  2. //泛型是Doc对象和ID的类型
  3. public interface OrderRepository extends ElasticsearchRepository<OrderDoc, String> {
  4. }
  1. 编写Service实现CRUD基本操作
  1. public interface OrderDocService {
  2. void saveAll(List<OrderDoc> orderDocs);
  3. OrderDoc findById(String id);
  4. void deleteById(String id);
  5. void updateById(OrderDoc orderDoc);
  6. PageResponse<OrderDoc> findList(OrderDoc orderDoc, Integer pageIndex, Integer pageSize);
  7. PageResponse<OrderDoc> findAll(Integer pageIndex, Integer pageSize);
  8. PageResponse<OrderDoc> findHighlight(OrderDoc orderDoc, Integer pageIndex, Integer pageSize);
  9. }
  1. 实现类代码
  1. @Service
  2. public class OrderDocServiceImpl implements OrderDocService {
  3. @Autowired
  4. private OrderRepository orderRepository;
  5. @Autowired
  6. private ElasticsearchRestTemplate template;
  7. @Override
  8. public void saveAll(List<OrderDoc> orderDocs) {
  9. orderRepository.saveAll(orderDocs);
  10. }
  11. @Override
  12. public OrderDoc findById(String id) {
  13. return orderRepository.findById(id).orElse(null);
  14. }
  15. @Override
  16. public void deleteById(String id) {
  17. orderRepository.deleteById(id);
  18. }
  19. @Override
  20. public void updateById(OrderDoc orderDoc) {
  21. orderRepository.save(orderDoc);
  22. }
  23. @Override
  24. public PageResponse<OrderDoc> findList(OrderDoc orderDoc, Integer pageIndex, Integer pageSize) {
  25. CriteriaQuery criteriaQuery = new CriteriaQuery(
  26. new Criteria().and("title").contains(orderDoc.getTitle()),PageRequest.of(pageIndex,pageSize));
  27. SearchHits<OrderDoc> searchHits = template.search(criteriaQuery, OrderDoc.class);
  28. List<OrderDoc> orderDocList = searchHits.getSearchHits().stream()
  29. .map(orderDocSearchHit -> orderDocSearchHit.getContent()).collect(Collectors.toList());
  30. return new PageResponse<OrderDoc>(searchHits.getTotalHits() ,orderDocList);
  31. }
  32. @Override
  33. public PageResponse<OrderDoc> findAll(Integer pageIndex, Integer pageSize) {
  34. Page<OrderDoc> page = orderRepository.findAll(PageRequest.of(pageIndex, pageSize));
  35. return new PageResponse<OrderDoc>(page.getTotalElements(),page.getContent());
  36. }
  37. @Override
  38. public PageResponse<OrderDoc> findHighlight(OrderDoc orderDoc, Integer pageIndex, Integer pageSize) {
  39. //查询条件
  40. CriteriaQuery criteriaQuery = new CriteriaQuery(
  41. new Criteria().and("title").contains(orderDoc.getTitle()),
  42. PageRequest.of(pageIndex,pageSize));
  43. //高亮字段
  44. HighlightBuilder highlightBuilder = new HighlightBuilder();
  45. highlightBuilder.field("title").preTags("<font style='color:red'>").postTags("</font>");
  46. criteriaQuery.setHighlightQuery(new HighlightQuery(highlightBuilder));
  47. //搜索结果
  48. SearchHits<OrderDoc> searchHits = template.search(criteriaQuery, OrderDoc.class);
  49. List<OrderDoc> orderDocList = searchHits.get().map(searchHit -> {
  50. //把高亮结果添加到doc中中
  51. OrderDoc doc = searchHit.getContent();
  52. //获取高亮
  53. doc.setHighlights(searchHit.getHighlightFields());
  54. return doc;
  55. }).collect(Collectors.toList());
  56. //处理结果
  57. return new PageResponse<>(searchHits.getTotalHits() , orderDocList);
  58. }
  59. }
  1. 结果响应对象
  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class PageResponse<T> {
  5. private Long total;
  6. private List<T> list;
  7. }

8.编写测试类进行测试

  1. public class OrderDocServiceTest {
  2. @Autowired
  3. private OrderDocService orderDocService;
  4. @Test
  5. public void saveAll() {
  6. orderDocService.saveAll(Arrays.asList(
  7. new OrderDoc("1",100000l,"苹果电脑"),
  8. new OrderDoc("2",100000l,"苹果电脑"),
  9. new OrderDoc("3",100000l,"苹果电脑"),
  10. new OrderDoc("4",100000l,"苹果电脑"),
  11. new OrderDoc("5",100000l,"苹果电脑"),
  12. new OrderDoc("6",100000l,"苹果电脑"),
  13. new OrderDoc("7",100000l,"苹果电脑")
  14. ));
  15. }
  16. @Test
  17. public void findById() {
  18. System.out.println(orderDocService.findById("1"));
  19. }
  20. @Test
  21. public void deleteById() {
  22. orderDocService.deleteById("1");
  23. }
  24. @Test
  25. public void updateById() {
  26. OrderDoc orderDoc = orderDocService.findById("1");
  27. orderDoc.setTitle("华为电脑");
  28. orderDocService.updateById(orderDoc);
  29. }
  30. @Test
  31. public void findList() {
  32. OrderDoc orderDoc = new OrderDoc(null, 100l, "电脑");
  33. PageResponse<OrderDoc> response = orderDocService.findList(orderDoc, 0, 10);
  34. System.out.println(response.getTotal());
  35. response.getList().forEach(System.out::println);
  36. }
  37. @Test
  38. public void findAll() {
  39. PageResponse<OrderDoc> response = orderDocService.findAll( 0, 10);
  40. System.out.println(response.getTotal());
  41. response.getList().forEach(System.out::println);
  42. }
  43. @Test
  44. public void findHighlight() {
  45. OrderDoc orderDoc = new OrderDoc(null, 100l, "电脑",null);
  46. PageResponse<OrderDoc> response = orderDocService.findHighlight( orderDoc,0, 10);
  47. System.out.println(response.getTotal());
  48. response.getList().forEach(System.out::println);
  49. }
  50. }

其中的高亮显示是在ES7.9.x版本才有的好像,我在ES7.7版本显示报错,有一个方法不支持了。

因此我上网找了一篇支持高亮显示的文章进行参考,最终实现高亮显示的效果

elasticsearch与springboot整合之高亮显示处理方法_springboot 对接es7.17的高亮不通过注解-CSDN博客

总结:目前SpringBoot集成ES主要有两种方式

  1. 通过Spring Data Elasticsearch,由SpringBoot官方集成好的直接使用即可,方便快捷,不过在一些高级查询上不太灵活

2.通过Java REST Client,可以针对行复杂操作或自定义行为的场景条件进行构造查询条件。

2.2. Java REST Client方式

使用步骤:

1.导入依赖

  1. <dependency>
  2. <groupId>org.elasticsearch.client</groupId>
  3. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  4. <version>7.10.1</version>
  5. </dependency>
  1. 在配置文件中配置连接
  1. elasticsearch:
  2. host: 127.0.0.1
  3. port: 9200
  4. scheme: http
  1. 编写配置类进行客户端连接配置
  1. @Configuration
  2. public class ElasticsearchConfig {
  3. @Value("${elasticsearch.host}")
  4. private String host;
  5. @Value("${elasticsearch.port}")
  6. private int port;
  7. @Value("${elasticsearch.scheme}")
  8. private String scheme;
  9. @Bean
  10. public RestHighLevelClient restHighLevelClient() {
  11. RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, scheme));
  12. return new RestHighLevelClient(builder);
  13. }
  14. }

4.通过RestHighLevelClient提供的API来操作Elasticsearch数据。可以进行索引的创建、文档的增删改查等操作

注意:RestHighLevelClient在Elasticsearch 8.x版本后已被替换为Elasticsearch Java API Client,如果有需要的话就上网查下怎么用吧


本文转载自: https://blog.csdn.net/wxhlhxpy/article/details/143059670
版权归原作者 技术小泽 所有, 如有侵权,请联系我们删除。

“ES在SpringBoot集成使用”的评论:

还没有评论