SpringBoot整合Elasticsearch6.xxx搜索引擎实战

  • 一、导入相关依赖包
  • 二、配置application.properties文件
  • 三、ES存储实体类及注解
    • 1、测试创建索引
  • 四、CRUD测试
  • 五、项目代码 (部分核心代码)
    • 1、 业务需求,将数据备份至ES,需要检索的信息备份至ES中(需要进行检索的字段)
  • 六、最后效果
  • 七、结语

一、导入相关依赖包

Spring Data Elasticsearch是Spring Data项目下的一个子模块。

spring Data 的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率。

<!--Spring Boot默认使用SpringData Es模块进行操作-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

二、配置application.properties文件

#SpringData es服务器地址配置,根据自己搭建的服务器地址填写
#自己es节点名称(默认不配置的情况下就是elasticsearch这个名称)
spring.data.cassandra.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes =192.168.177.60:9300

三、ES存储实体类及注解

/*** @ClassName: es* @description: 政策文件索引实体类(ES中使用)* @Author: admin* @Data: 2020-04-04 21:43* @Version: 1.0**/@Data
@Document(indexName = "policy",type = "docs", shards = 1, replicas = 0)
public class PolicyIndex {@Idprivate Integer id;              //主键ID@Field(type = FieldType.Keyword)private Integer smallType;       //小分类ID@Field(type = FieldType.Keyword)private Integer bigType;         //大分类ID@Field(type = FieldType.Text, analyzer = "ik_max_word")private String policyTitle;   //标题@Field(type = FieldType.Text, analyzer = "ik_max_word")private String policyContent; //内容
}

注: Spring Data通过注解来声明字段的映射属性

1、测试创建索引

    /*** 创建索引*/@Testpublic void testCreate() {// 创建索引,会根据PolicyIndex类的@Document注解信息来创建elasticsearchTemplate.createIndex(PolicyIndex.class);// 配置映射,会根据Item类中的id、Field等字段来自动完成映射elasticsearchTemplate.putMapping(PolicyIndex.class);}

四、CRUD测试

Spring Data 的强大之处,就在于你不用写任何DAO处理,自动根据方法名或类的信息进行CRUD操作。只要你定义一个接口,然后继承Repository提供的一些子接口,就能具备各种基本的CRUD功能。

import com.dt.es.entity.PolicyIndex;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;public interface PolicyIndexRepository extends ElasticsearchRepository<PolicyIndex,Integer> {}
     /*** 添加数据修改数据*/@Testpublic void testAdd() {PolicyIndex policyIndex = new PolicyIndex();policyIndex.setId(13);policyIndex.setBigType(4);policyIndex.setSmallType(5);policyIndex.setPolicyTitle("spring开发基础");policyIndex.setPolicyContent("spring 在java领域非常流行,java程序员都在用。");PolicyIndex policyIndex1 = policyIndexRepository.save(policyIndex);System.out.println(policyIndex1);}/*** 判断索引是否存在*/@Testpublic void testExit(){Boolean flag = elasticsearchTemplate.indexExists("policy");System.out.println(flag);}/**** 根据ID查询*/@Testpublic void testQuery(){Optional<PolicyIndex> optional = policyIndexRepository.findById(5);System.out.println(optional.get());}/**** 基本查询*/@Testpublic void testQuery1(){// 词条查询MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("bigType", 3);// 执行查询Iterable<PolicyIndex> items = this.policyIndexRepository.search(queryBuilder);items.forEach(System.out::println);}/*** ES查询方式*/@Testpublic void testNativeQuery(){// 构建查询条件NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 添加基本的查询方式//1、Term Query为精确查询,在搜索时会整体匹配关键字,不再将关键字分词。//queryBuilder.withQuery(QueryBuilders.termQuery("bigType", 5));//2、match Query即全文检索,它的搜索方式是先将搜索字符串分词,再使用各各词条从索引中搜索、match query与Term query区别是match query在搜索前先将搜索关键字分词,再拿各各词语去索引中搜索。/*operator:or 表示 只要有一个词在文档中出现则就符合条件,and表示每个词都在文档中出现则才符合条件*///queryBuilder.withQuery(QueryBuilders.matchQuery("policyTitle","IT开发").operator((Operator.OR)));//queryBuilder.withQuery(QueryBuilders.matchQuery("policyTitle","东发"));//queryBuilder.withQuery(QueryBuilders.matchQuery("policyContent","人工"));//3、multiQuery,一次可以匹配多个字段,匹配到任何一个字段结果都可以。// 1>> 全文检索//提升boost 通常关键字匹配上policyTitle的权重要比匹配上policyContent的权重高,这里可以对policyTitle的权重提升MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("哈哈","哈哈哈","policyTitle", "policyContent").minimumShouldMatch("50%");multiMatchQueryBuilder.field("policyTitle",10);//提升boostqueryBuilder.withQuery(multiMatchQueryBuilder);// 2>> 精确查询TermQueryBuilder smallQueryBuilder = QueryBuilders.termQuery("smallType", 4);TermQueryBuilder bigQueryBuilder = QueryBuilders.termQuery("bigType", 2);//3、布尔查询//must:表示必须,多个查询条件必须都满足。(通常使用must)//should:表示或者,多个查询条件只要有一个满足即可。//must_not:表示非。BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(multiMatchQueryBuilder);boolQueryBuilder.must(smallQueryBuilder);boolQueryBuilder.must(bigQueryBuilder);//4、过虑器、过虑是针对搜索的结果进行过虑,过虑器主要判断的是文档是否匹配,不去计算和判断文档的匹配度得分,所以过//虑器性能比查询要高,且方便缓存,推荐尽量使用过虑器去实现查询或者过虑器和查询共同使用。//range:范围过虑、term:项匹配过虑boolQueryBuilder.filter(QueryBuilders.termQuery("policyTitle", "文件"));//boolQueryBuilder.filter(QueryBuilders.rangeQuery("bigType").gte(0).lte(3));queryBuilder.withQuery(boolQueryBuilder);// 执行搜索,获取结果Page<PolicyIndex> items = this.policyIndexRepository.search(queryBuilder.build());// 打印总条数System.out.println("匹配记录数:"+items.getTotalElements());// 打印总页数//System.out.println(items.getTotalPages());items.forEach(System.out::println);}/*** 分页查询*/@Testpublic void testNativeQuery2(){// 构建查询条件NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();// 添加基本的分词查询queryBuilder.withQuery(QueryBuilders.matchQuery("policyContent","哈哈哈"));queryBuilder.withQuery(QueryBuilders.termQuery("policyTitle", "旅游局"));// 初始化分页参数int page = 0;int size = 3;// 设置分页参数queryBuilder.withPageable(PageRequest.of(page, size));// 执行搜索,获取结果Page<PolicyIndex> items = this.policyIndexRepository.search(queryBuilder.build());// 打印总条数System.out.println(items.getTotalElements());// 打印总页数System.out.println(items.getTotalPages());// 每页大小System.out.println(items.getSize());// 当前页System.out.println(items.getNumber());items.forEach(System.out::println);}

五、项目代码 (部分核心代码)

1、 业务需求,将数据备份至ES,需要检索的信息备份至ES中(需要进行检索的字段)

     /**** 将数据循环写入数据库中* @param id* @param url* @return* @throws IOException*/@RequestMapping(value = "save",method = RequestMethod.POST)@ResponseBodypublic Map<String, Object> save(Integer id,Integer regionId,Integer sortId,String url) throws IOException{Map<String, Object> resultMap = new HashMap < > ();//构建一个FileFile file = new File(url);//通过fileutils拿到文件的字符串String str = FileUtils.readFileToString(file, "utf-8");//对基本类型的解析JSONArray jsonArray = new JSONArray(str);System.out.println(jsonArray);for (int i = 0; i < jsonArray.length(); i++) {JSONObject jsonObject = jsonArray.getJSONObject(i);String time = jsonObject.getString("time");String title = jsonObject.getString("title");String content = jsonObject.getString("content");//1、存入数据库PolicyInfo pInfo = new PolicyInfo();pInfo.setPolicyTitle(title);pInfo.setPolicyContent(content);pInfo.setPolicyTime(time);pInfo.setBigType(regionId);pInfo.setSmallType(sortId);pInfo.setUserId(1);pInfo.setPreviewCount(0);policyInfoService.savePolicInfo(pInfo);System.out.println("输出ID=="+pInfo.getId());//1、存入ES索引库PolicyIndex policyIndex = new PolicyIndex();policyIndex.setId(pInfo.getId());policyIndex.setPolicyTitle(title);policyIndex.setPolicyContent(content);policyIndex.setBigType(regionId);policyIndex.setSmallType(sortId);policyIndexRepository.save(policyIndex);//打印输出System.out.println("【time】"+time);System.out.println("【title】"+title);System.out.println("【content】"+content);System.out.println("【程序执行次数】:" + i);}//更新是否存储状态int count = categoryService.updateCategoryById(id);if(count > 0){resultMap.put("code", 200);resultMap.put("msg", "success");resultMap.put("data", null);}else{resultMap.put("code", 500);resultMap.put("msg", "fail");resultMap.put("data", null);}return resultMap;}
    @Autowired  //注入private PolicyIndexRepository policyIndexRepository;/**** ES全文检索(单个条件)* @param model* @param policyTitle* @return*/@GetMapping(value = "file")public String search(Model model,@RequestParam(name = "policyTitle",required = false) String policyTitle,@RequestParam(name = "bigType",required = false) Integer bigType,@RequestParam(name = "smallType",required = false) Integer smallType){//1、构建查询条件NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();//3、设置查询方式if(policyTitle != null){System.out.println("全文检索");MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("policyTitle", policyTitle);queryBuilder.withQuery(matchQueryBuilder);}if(bigType != null){System.out.println("精确匹配大分类");TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("bigType", bigType);queryBuilder.withQuery(termQueryBuilder);}if(smallType != null){System.out.println("精确匹配小分类");TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("smallType", smallType);queryBuilder.withQuery(termQueryBuilder);}//5、执行搜索Page<PolicyIndex> items = policyIndexRepository.search(queryBuilder.build());// 打印总条数System.out.println("匹配记录数:"+items.getTotalElements());//6、获取结果返回页面model.addAttribute("policyTitle",policyTitle);model.addAttribute("policies",items);//打印输出items.forEach(System.out::println);return "front/search";}/**** ES全文检索(多个条件)* @param model* @param policyIndex* @return*/@GetMapping(value = "advancedSearch")public String advancedSearch(Model model, PolicyIndex policyIndex){//构建查询条件NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();//创建布尔(bool)查询对象BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//搜索条件//1、根据关键字搜索if(StringUtils.isNotEmpty(policyIndex.getPolicyTitle())){MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(policyIndex.getPolicyTitle(),"policyTitle","policyContent").minimumShouldMatch("70%").field("policyTitle",10);boolQueryBuilder.must(multiMatchQueryBuilder);}//根据分类查询if(policyIndex.getBigType() != null){//一级分类boolQueryBuilder.filter(QueryBuilders.termQuery("bigType",policyIndex.getBigType()));}if(policyIndex.getSmallType() != null){//二级分类boolQueryBuilder.filter(QueryBuilders.termQuery("smallType",policyIndex.getSmallType()));}//设置boolQueryBuilder到queryBuilderqueryBuilder.withQuery(boolQueryBuilder);//执行检索Page<PolicyIndex> items = policyIndexRepository.search(queryBuilder.build());model.addAttribute("policies",items);return "front/search";}

六、最后效果


七、结语

喜欢的小伙伴多多支持,另外不会ES的看我一篇博客文章,当你搭建了ES环境之后,可以使用kibana可视化工具,使用命令的方式,熟悉ES的一些CRUD操作,这样编码的时候就不会迷路了。

上链接:https://blog.csdn.net/qq_41107231/article/details/105625498

全新SpringBoot整合Elasticsearch6.xxx搜索引擎实战相关推荐

  1. 第五章 - 分布式定时任务框架ElasticJob之SpringBoot整合SimpleJob作业(实战一)

    系列文章目录 第一章 - 分布式定时任务框架ElasticJob之JavaApi整合Simple作业 第二章 - 分布式定时任务框架ElasticJob之JavaApi整合DataflowJob作业 ...

  2. SpringBoot整合kafka之kafka分区实战

    本文来说下SpringBoot整合kafka之kafka分区实战 文章目录 准备工作 程序代码 程序测试 本文小结 准备工作 当然我们也可以不手动创建topic,在执行代码kafkaTemplate. ...

  3. SpringBoot整合kafka实战之带回调的生产者

    本文来说下SpringBoot整合kafka部分知识内容 文章目录 带回调的生产者 方式一 方式二 本文小结 带回调的生产者 前面我们说了简单的生产和消费,本文说下带回调的生产者.kafkaTempl ...

  4. Springboot 整合 Netty 实战(附源码)

    作者:pjmike_pj juejin.im/post/5bd584bc518825292865395d 前言 这一篇文章主要介绍如何用Springboot 整合 Netty,由于本人尚处于学习Net ...

  5. 【SpringBoot】Logback日志框架介绍和SpringBoot整合实战

    ========================11.Logback日志框架介绍和SpringBoot整合实战 2节课================================ 1.新日志框架L ...

  6. SpringBoot整合RabbitMq实战(一)

    1 Spring AMQP 简介 Spring AMQP项目是一个引入Spring核心概念用于基于高级消息队列(AMQP)的解决方案的开发,它提供了一个模板用于发送和接受消息的高级抽象.它对基于消息驱 ...

  7. SpringBoot 整合WebSocket 简单实战案例

    前言 这个简单实战案例主要目的是让大家了解websocket的一些简单使用. 另外使用stomp方式的: <Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 ...

  8. 【案例实战】SpringBoot整合Redis的GEO实现查找附近门店功能

    像我们平常美团点外卖的时候,都会看到一个商家距离我们多少米.还有类似QQ附近的人,我们能看到附近的人距离我们有多少米. 那么这些业务是怎么做的呢?是如何实现 基于位置的附近服务系统呢. 在去了解基于位 ...

  9. SpringBoot整合Redis+mybatis,封装RedisUtils工具类等实战(附源码)

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料+视频 作者:陈彦斌 cnblogs.com/chenyanbin/ ...

最新文章

  1. 我们参观机器人产业园的感想_工商联组织执常委赴醴陵华鑫电瓷电器产业园交流学习...
  2. 什么是 Ethernet Switch
  3. 使用eclipse集成开发环境开发第一个嵌入式Linux驱动
  4. ScottGu之博客翻译-LINQ to SQL第四部分,更新数据库 LINQ to SQL (Part 4 - Updating our Database)...
  5. android 获取monkey日志_Android压力测试:monkey压力测试实战
  6. android imageview 设置网络图片,ImageView加载网络图片
  7. python系统编程模块_Python系统进程管理模块
  8. 死锁发生的条件以及如何避免死锁
  9. win10 linux 傲腾,Win10 版本 2004 导致英特尔傲腾内存出问题,千万不要强制升级
  10. 成都盛铭轩:商家怎么装修设计
  11. 浅析《数据安全能力成熟度模型》
  12. word文档如何画线条流程图_如何在WORD中画流程图
  13. 亚马逊买家多账号如何运行管理?
  14. 用Java实现信号量机制
  15. 一个优秀程序员可抵五个普通程序员!
  16. CSS样式网页导航条
  17. 电脑开机蓝屏代码C000021a
  18. python笔记 - urllib模块(二十一)
  19. 常用的图像特征提取方法
  20. 最简单的混合开发教程:APICloud.

热门文章

  1. sdh管理单元指针_SDH设备上STM-1接口是啥玩意
  2. javascript获取系统时间时区_详解Linux操作系统修改时间和修改时区的方法
  3. 信息学奥赛一本通 1062:最高的分数 | OpenJudge NOI 1.5 05
  4. 信息学奥赛一本通(2021:【例4.6】最大公约数)
  5. 线性结构 —— 差分数组
  6. PHP中mysql如何添加记录_PHP向MySql提交数据添加记录的简单代码_PHP教程
  7. android案例_Android实训案例——计算器的运算逻辑
  8. 排序算法——十大排序算法的图示与实现
  9. javafx项目_为什么选择javafx?
  10. 资源:代码舞动动画 提供gif图片(含程序、源码、下载地址)