欢迎关注方志朋的博客,回复”666“获面试宝典

前言

该文章需要提前准备好Elasticsearch7.6以及ik分词器的环境,如果还没准备好的可以看看

https://blog.csdn.net/weixin_44102992/article/details/107954129

集成环境准备

1.导入spring-data-elasticsearch依赖

版本需要与Elasticsearch一致,还需要注意自己的springboot版本是否支持

本文springboot为2.3,依赖也为2.3,elasticsearch为7.6.2

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>${version}.RELEASE</version>
</dependency>

2.elasticsearch配置文件

因为原来的配置不支持了

配置文件如下:

@Configuration
public class EsConf {@Value("${elasticSearch.url}")private String edUrl;//localhost:9200 写在配置文件中就可以了@BeanRestHighLevelClient client() {ClientConfiguration clientConfiguration = ClientConfiguration.builder().connectedTo(edUrl)//elasticsearch地址.build();return RestClients.create(clientConfiguration).rest();}
}

3.实体类准备

关于实体类中的几个注解,不清楚的可以去查看文档,这里不过多介绍了

@Data
@Document(indexName = "user")//索引名称 建议与实体类一致
public class User {@Idprivate Integer id;@Field(type = FieldType.Auto)//自动检测类型private Integer age;@Field(type = FieldType.Keyword)//手动设置为keyword  但同时也就不能分词private String name;@Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_max_word")//设置为text  可以分词private String info;
}

4.Elasticsearch Service准备

ElasticsearchRepository<,>第一个就是所准备的实体类,第二个是id的类型

继承完这个会提供最基本的增删改查方法,也可以自己定义一些,自己定义的方法命名需要符合规则,并不需要自己去实现

public interface EsUserService extends ElasticsearchRepository<User,Integer> {//根据name查询List<User> findByName(String name);//根据name和info查询List<User> findByNameAndInfo(String name,String info);
}

简单查询

这里直接使用假数据并没有连接数据库,还需要注意几个点:

  1. elasticsearchTemplate需要采用ElasticsearchRestTemplate 原来的已经过时了

  2. elasticsearch的mapping没有自动生成,这导致了我们在实体类中指定的分词器没有生效,所以我在导入数据的同时,手动导入了mapping

  3. LogAnnotation是我自定义的注解,大家可以直接去掉

controller如下:

@RestController
public class EsController {@Autowiredprivate ElasticsearchRestTemplate elasticsearchTemplate;@Autowiredprivate EsUserService esUserService;private String[] names={"诸葛亮","曹操","李白","韩信","赵云","小乔","狄仁杰","李四","诸小明","王五"};private String[] infos={"我来自中国的一个小乡村,地处湖南省","我来自中国的一个大城市,名叫上海,人们称作魔都","我来自东北,家住大囤里,一口大碴子话"};@LogAnnotation(requestRemark = "存数据")@GetMapping("saveUser")public ResultVO saveUser(){//添加索引mapping    索引会自动创建但mapping自只用默认的这会导致分词器不生效 所以这里我们手动导入mappingelasticsearchTemplate.putMapping(User.class);Random random = new Random();List<User> users = new ArrayList<>();for (int i=0;i<20;i++){User user = new User();user.setId(i);user.setName(names[random.nextInt(9)]);user.setAge(random.nextInt(40)+i);user.setInfo(infos[random.nextInt(2)]);users.add(user);}Iterable<User> users1 = esUserService.saveAll(users);return new ResultVO(users1);}@LogAnnotation(requestRemark = "根据id查询数据")@GetMapping("getDataById")public ResultVO getDataById(Integer id){return new ResultVO(esUserService.findById(id));}@LogAnnotation(requestRemark = "分页查询所有数据")@GetMapping("getAllDataByPage")public ResultVO getAllDataByPage(){//本该传入page和size,这里为了方便就直接写死了Pageable page = PageRequest.of(0,10, Sort.Direction.ASC,"id");Page<User> all = esUserService.findAll(page);return new ResultVO(all.getContent());}@LogAnnotation(requestRemark = "根据名字查询")@GetMapping("getDataByName")public ResultVO getDataByName(String name){return new ResultVO(esUserService.findByName(name));}@LogAnnotation(requestRemark = "根据名字和介绍查询")@GetMapping("getDataByNameAndInfo")public ResultVO getDataByNameAndInfo(String name,String info){//这里是查询两个字段取交集,即代表两个条件需要同时满足return new ResultVO(esUserService.findByNameAndInfo(name,info));}
}

测试结果:

分词高亮查询

@LogAnnotation(requestRemark = "查询高亮显示")@GetMapping("getHightByUser")public ResultVO getHightByUser(String value){//根据一个值查询多个字段  并高亮显示  这里的查询是取并集,即多个字段只需要有一个字段满足即可//需要查询的字段BoolQueryBuilder boolQueryBuilder= QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("info",value)).should(QueryBuilders.matchQuery("name",value));//构建高亮查询NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withHighlightFields(new HighlightBuilder.Field("info"),new HighlightBuilder.Field("name")).withHighlightBuilder(new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>")).build();//查询SearchHits<User> search = elasticsearchTemplate.search(searchQuery, User.class);//得到查询返回的内容List<SearchHit<User>> searchHits = search.getSearchHits();//设置一个最后需要返回的实体类集合List<User> users = new ArrayList<>();//遍历返回的内容进行处理for(SearchHit<User> searchHit:searchHits){//高亮的内容Map<String, List<String>> highlightFields = searchHit.getHighlightFields();//将高亮的内容填充到content中searchHit.getContent().setName(highlightFields.get("name")==null ? searchHit.getContent().getName():highlightFields.get("name").get(0));searchHit.getContent().setInfo(highlightFields.get("info")==null ? searchHit.getContent().getInfo():highlightFields.get("info").get(0));//放到实体类中users.add(searchHit.getContent());}return new ResultVO(users);}

测试结果:

来源:blog.csdn.net/weixin_44102992/article/

details/108033164

热门内容:
  • 使用雪花id或uuid作为Mysql主键,被老板怼了一顿!

  • 面试官:如果要存ip地址,用什么数据类型比较好

  • 干掉visio,这个画图神器真的绝了!!!

  • 真正的缓存之王,Google Guava 只是弟弟

  • 频频曝出程序员被抓,我们该如何避免面向监狱编程?

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

SpringBoot + Elasticsearch7.6实现简单查询及高亮分词查询相关推荐

  1. Elasticsearch7+SpringBoot实现简单查询及高亮分词查询

    前言 该文章需要提前准备好Elasticsearch7.6以及ik分词器的环境,如果还没准备好的可以看看 https://blog.csdn.net/weixin_44102992/article/d ...

  2. Elasticsearch7.17 二:mapping映射和高级语法查询DSL

    文章目录 mapping映射和高级语法查询DSL 文档映射Mapping 映射类型 更改Mapping的字段类型 常用Mapping参数配置 批量操作 ES高级查询Query DSL 查询所有matc ...

  3. springboot+Elasticsearch实现word,pdf,txt内容抽取并高亮分词全文检索

    文章目录 需求 一.环境 二.功能实现 1.搭建环境 2.文件内容识别 三.代码 需求 产品希望我们这边能够实现用户上传PDF,WORD,TXT之内得文本内容,然后用户可以根据附件名称或文件内容模糊查 ...

  4. java+cache使用方法_java相关:springboot使用GuavaCache做简单缓存处理的方法

    java相关:springboot使用GuavaCache做简单缓存处理的方法 发布于 2020-3-29| 复制链接 摘记: 问题背景 实际项目碰到一个上游服务商接口有10秒的查询限制(同个账号). ...

  5. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

    Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...

  6. SpringBoot使用SpringDataJPA通过@Query注解多对多分页查询

    文章目录 SpringBoot使用JPA@Query注解查询 1. 环境配置 2. 数据库表配置 3. 实体类配置 4. Dao代码 5. Service 代码 6. Controller 代码 7. ...

  7. ArcEngine简单教程——要素的属性查询、空间查询

    其他教程请见: ArcEngine简单教程汇总 目录 ArcEngine简单教程汇总​​​​​​​ 1 目的 2 概要 空间查询 属性查询 3 关键代码 4小结 ​​​​​​​ 1 目的 实现简单的地 ...

  8. ElasticSearch + Kibana + logstash+ik结合springboot代码实现,比较ES和传统Mysql查询效率

    开发环境:Win10 开发环境:STS 概要:此篇文章主要是传统的Mysql查询和ES查询两种方式的效率比较,以及代码实现,另外使用logstash进行mysql数据的同步也可以直接理解为" ...

  9. 查询所有张姓同学学号6_只需简单几步 做出属于老师自己的专属成绩查询表格 方便家长查询...

    今天我们来动手自制一个专属的.简单又实用的查询表格吧!(查询成绩.工资等都是可以的哦,原理是一样滴) 先来看看我们今天需要达到的效果: 输入正确的姓名以及学号就可以查询相应的成绩,如果输入不对应的学号 ...

最新文章

  1. 如何让hierarchyviewer调试查看商业版真机上的应用
  2. Java isAlive()和join()的使用
  3. html2canvas图片不能正常截取,html2canvas关于图片不能正常截取
  4. python学习-抓取知乎图片
  5. python-多继承
  6. 20171227/20171027
  7. 微信小程序批量获取input的输入值,监听输入框,数据同步
  8. 怎样对ListView的项进行排序
  9. Android实现浮层的上下滑动(支持内部加入View)
  10. 移位运算与除法、取模运算
  11. python程序员面试题精选100题_在Python程序员面试中被问的最多的10道题
  12. MAC读写NTFS移动硬盘的解决办法
  13. jquery 获取整个表单_15个表单验证jQuery插件和库
  14. 创建oracle数据库job服务:PlSqlDev操作job
  15. linux下jdk1.8搭建笔记
  16. 注册测绘师考试复习视频资料
  17. 【MATLAB】图像分割实验
  18. 在各级供应商的表达中,OEM,Tier One (Tier 1),Tier Two (Tier 2)的概念和区别
  19. 3原色对照表.....
  20. 游戏运营之数据的重要性

热门文章

  1. c语言坐标正反算代码,C语言代码逆向的实战十篇(原创)
  2. 20165219王彦博《基于Cortex-M4的虚拟机制作与测试》课程设计个人报告
  3. python2.7 Cheetah You don't have the C version of NameMapper installed
  4. 【CF EDU59 E】 Vasya and Binary String (DP)
  5. 牛客国庆集训派对Day6 B.Board
  6. 如何删除一个CSDN上自己上传的资源
  7. 【bzoj3261】最大异或和 可持久化Trie树
  8. 用eclipse玩转Python,让习惯java开发的童鞋拥有一个更爽的开发体验
  9. 【洛谷P1697】货车运输
  10. CSS3关于过渡效果的问题