ES在SpringBoot集成利用

打印 上一主题 下一主题

主题 863|帖子 863|积分 2589

1. 在Docker中安装Elasticsearch

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


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


  • 安装ES并启动
  1. docker pull elasticsearch <ES版本>
  2. eg:docker 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地址是无法毗连的,需要进行跨域设置,因为是前后端分离的

  • 修改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. <dependency>
  2.             <groupId>org.springframework.boot</groupId>
  3.             <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4.         </dependency>
复制代码

  • 在设置文件中参加
  1. server:
  2.   port: 8000 //可以改端口
  3. spring:
  4.   elasticsearch:
  5.     rest:
  6.       uris:
  7.         - http://localhost:9200 //es容器的地址,ip要换成虚拟机ip
复制代码

  • 在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.    
  8.    
  9.     @Id
  10.     @Field(type = FieldType.Keyword)
  11.     private String id;
  12.     @Field(type = FieldType.Long)
  13.     private Long orderNo;
  14.     @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
  15.     private String title;
  16.     //用来封装高亮的结果
  17.     private Map<String, List<String>> highlights;
  18.     public OrderDoc(String id, Long orderNo ,String title){
  19.    
  20.    
  21.         this.id = id;
  22.         this.orderNo = orderNo;
  23.         this.title =title;
  24.     }
  25. }
复制代码

  • 编写Repository接口
  1. @Repository
  2. //泛型是Doc对象和ID的类型
  3. public interface OrderRepository extends ElasticsearchRepository<OrderDoc, String> {
  4.    
  5.    
  6. }
复制代码

  • 编写Service实现CRUD基本操作
  1. public interface OrderDocService {
  2.    
  3.    
  4.     void saveAll(List<OrderDoc> orderDocs);
  5.     OrderDoc findById(String id);
  6.     void deleteById(String id);
  7.     void updateById(OrderDoc orderDoc);
  8.     PageResponse<OrderDoc> findList(OrderDoc orderDoc, Integer pageIndex, Integer pageSize);
  9.     PageResponse<OrderDoc> findAll(Integer pageIndex, Integer pageSize);
  10.     PageResponse<OrderDoc> findHighlight(OrderDoc orderDoc, Integer pageIndex, Integer pageSize);
  11. }
复制代码

  • 实现类代码
  1. @Service
  2. public class OrderDocServiceImpl implements OrderDocService {
  3.    
  4.    
  5.     @Autowired
  6.     private OrderRepository orderRepository;
  7.     @Autowired
  8.     private ElasticsearchRestTemplate template;
  9.     @Override
  10.     public void saveAll(List<OrderDoc> orderDocs) {
  11.    
  12.    
  13.         orderRepository.saveAll(orderDocs);
  14.     }
  15.     @Override
  16.     public OrderDoc findById(String id) {
  17.    
  18.    
  19.         return orderRepository.findById(id).orElse(null);
  20.     }
  21.     @Override
  22.     public void deleteById(String id) {
  23.    
  24.    
  25.         orderRepository.deleteById(id);
  26.     }
  27.     @Override
  28.     public void updateById(OrderDoc orderDoc) {
  29.    
  30.    
  31.         orderRepository.save(orderDoc);
  32.     }
  33.     @Override
  34.     public PageResponse<OrderDoc> findList(OrderDoc orderDoc, Integer pageIndex, Integer pageSize) {
  35.    
  36.    
  37.         CriteriaQuery criteriaQuery = new CriteriaQuery(
  38.                 new Criteria().and("title").contains(orderDoc.getTitle()),PageRequest.of(pageIndex,pageSize));
  39.         SearchHits<OrderDoc> searchHits = template.search(criteriaQuery, OrderDoc.class);
  40.         List<OrderDoc> orderDocList = searchHits.getSearchHits().stream()
  41.                 .map(orderDocSearchHit -> orderDocSearchHit.getContent()).collect(Collectors.toList());
  42.         return new PageResponse<OrderDoc>(searchHits.getTotalHits() ,orderDocList);
  43.     }
  44.     @Override
  45.     public PageResponse<OrderDoc> findAll(Integer pageIndex, Integer pageSize) {
  46.    
  47.    
  48.         Page<OrderDoc> page = orderRepository.findAll(PageRequest.of(pageIndex, pageSize));
  49.         return new PageResponse<OrderDoc>(page.getTotalElements(),page.getContent());
  50.     }
  51.     @Override
  52.     public PageResponse<OrderDoc> findHighlight(OrderDoc orderDoc, Integer pageIndex, Integer pageSize) {
  53.    
  54.    
  55.         //查询条件
  56.         CriteriaQuery criteriaQuery = new CriteriaQuery(
  57.                 new Criteria().and("title").contains(orderDoc.getTitle()),
  58.                 PageRequest.of(pageIndex,pageSize));
  59.         //高亮字段
  60.         HighlightBuilder highlightBuilder = new HighlightBuilder();
  61.         highlightBuilder.field("title").preTags("<font style='color:red'>").postTags("</font>");
  62.         criteriaQuery.setHighlightQuery(new HighlightQuery(highlightBuilder));
  63.         //搜索结果
  64.         SearchHits<OrderDoc> searchHits = template.search(criteriaQuery, OrderDoc.class);
  65.         List<OrderDoc> orderDocList = searchHits.get().map(searchHit -> {
  66.    
  67.    
  68.             //把高亮结果添加到doc中中
  69.             OrderDoc doc = searchHit.getContent();
  70.             //获取高亮
  71.             doc.setHighlights(searchHit.getHighlightFields());
  72.             return doc;
  73.         }).collect(Collectors.toList());
  74.         //处理结果
  75.         return new PageResponse<>(searchHits.getTotalHits() , orderDocList);
  76.     }
  77. }
复制代码

  • 结果响应对象
  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class PageResponse<T> {
  5.    
  6.    
  7.     private Long total;
  8.     private List<T> list;
  9. }
复制代码
8.编写测试类进行测试
  1. public class OrderDocServiceTest {
  2.    
  3.    
  4.     @Autowired
  5.     private OrderDocService orderDocService;
  6.     @Test
  7.     public void saveAll() {
  8.    
  9.    
  10.         orderDocService.saveAll(Arrays.asList(
  11.                 new OrderDoc("1",100000l,"苹果电脑"),
  12.                 new OrderDoc("2",100000l,"苹果电脑"),
  13.                 new OrderDoc("3",100000l,"苹果电脑"),
  14.                 new OrderDoc("4",100000l,"苹果电脑"),
  15.                 new OrderDoc("5",100000l,"苹果电脑"),
  16.                 new OrderDoc("6",100000l,"苹果电脑"),
  17.                 new OrderDoc("7",100000l,"苹果电脑")
  18.         ));
  19.     }
  20.     @Test
  21.     public void findById() {
  22.    
  23.    
  24.         System.out.println(orderDocService.findById("1"));
  25.     }
  26.     @Test
  27.     public void deleteById() {
  28.    
  29.    
  30.         orderDocService.deleteById("1");
  31.     }
  32.     @Test
  33.     public void updateById() {
  34.    
  35.    
  36.         OrderDoc orderDoc = orderDocService.findById("1");
  37.         orderDoc.setTitle("华为电脑");
  38.         orderDocService.updateById(orderDoc);
  39.     }
  40.     @Test
  41.     public void findList() {
  42.    
  43.    
  44.         OrderDoc orderDoc = new OrderDoc(null, 100l, "电脑");
  45.         PageResponse<OrderDoc> response = orderDocService.findList(orderDoc, 0, 10);
  46.         System.out.println(response.getTotal());
  47.         response.getList().forEach(System.out::println);
  48.     }
  49.     @Test
  50.     public void findAll() {
  51.    
  52.    
  53.         PageResponse<OrderDoc> response = orderDocService.findAll( 0, 10);
  54.         System.out.println(response.getTotal());
  55.         response.getList().forEach(System.out::println);
  56.     }
  57.     @Test
  58.     public void findHighlight() {
  59.    
  60.    
  61.         OrderDoc orderDoc = new OrderDoc(null, 100l, "电脑",null);
  62.         PageResponse<OrderDoc> response = orderDocService.findHighlight( orderDoc,0, 10);
  63.         System.out.println(response.getTotal());
  64.         response.getList().forEach(System.out::println);
  65.     }
  66. }
复制代码
其中的高亮显示是在ES7.9.x版本才有的似乎,我在ES7.7版本显示报错,有一个方法不支持了。
因此我上网找了一篇支持高亮显示的文章进行参考,最终实现高亮显示的效果
elasticsearch与springboot整合之高亮显示处理方法_springboot 对接es7.17的高亮不通过注解-CSDN博客
总结:目前SpringBoot集成ES主要有两种方式

  • 通过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. elasticsearch:  
  2.   host: 127.0.0.1  
  3.   port: 9200  
  4.   scheme: http
复制代码

  • 编写设置类进行客户端毗连设置
  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,假如有需要的话就上网查下怎么用吧

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表