1. 导入依赖

<dependencies><!-- ES的高阶的客户端API --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.6.1</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.1</version></dependency><!-- 阿里巴巴出品的一款将Java对象转换为JSON、将JSON转换为Java对象的库 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.14.3</version><scope>test</scope></dependency></dependencies>

2. 使用JavaAPI来操作ES集群

初始化连接

使用的是RestHighLevelClient去连接ES集群,后续操作ES中的数据

private RestHighLevelClient restHighLevelClient;public JobFullTextServiceImpl() {// 建立与ES的连接// 1. 使用RestHighLevelClient构建客户端连接。// 2. 基于RestClient.builder方法来构建RestClientBuilder// 3. 用HttpHost来添加ES的节点RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("192.168.11.111", 9200, "http"), new HttpHost("192.168.11.112", 9200, "http"), new HttpHost("192.168.11.113", 9200, "http"));restHighLevelClient = new RestHighLevelClient(restClientBuilder);
}

3. 新增/查询/删除/搜索/分页

* 新增:IndexRequest
* 更新:UpdateRequest
* 删除:DeleteRequest
* 根据ID获取:GetRequest
* 关键字检索:SearchRequest

3.1 新增数据

这里相当于动态映射

注意:可以在id字段上配置JsonField注解,并设置属性serialize=false,不会把id序列化,即没有必要存到es的source中,因为es会有id(会有单独设置id的方法),是source之外的。之前的插入数据的例子也没有把id放到source中。(这里可以根据需要自行取舍)

@Override
public void add(JobDetail jobDetail) throws IOException {//1.   构建IndexRequest对象,用来描述ES发起请求的数据。IndexRequest indexRequest = new IndexRequest(JOB_IDX);//2.   设置文档ID。indexRequest.id(jobDetail.getId() + "");//3.  使用FastJSON将实体类对象转换为JSON。String json = JSONObject.toJSONString(jobDetail);//4.  使用IndexRequest.source方法设置文档数据,并设置请求的数据为JSON格式。indexRequest.source(json, XContentType.JSON);//5.  使用ES High level client调用index方法发起请求,将一个文档添加到索引中。一般都会使用默认的请求方式:RequestOptions.DEFAULTrestHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
}

3.2 修改数据

做更新的时候你可以先调用exists是否存在的api,因为es如果文件不存在你去操作会有异常,判断是否存在是很快的,不需要封装数据。

@Override
public void update(JobDetail jobDetail) throws IOException {// 1.   判断对应ID的文档是否存在// a)  构建GetRequestGetRequest getRequest = new GetRequest(JOB_IDX, jobDetail.getId() + "");// b)   执行client的exists方法,发起请求,判断是否存在boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);if(exists) {// 2.   构建UpdateRequest请求UpdateRequest updateRequest = new UpdateRequest(JOB_IDX, jobDetail.getId() + "");// 3. 设置UpdateRequest的文档,并配置为JSON格式updateRequest.doc(JSONObject.toJSONString(jobDetail), XContentType.JSON);// 4.  执行client发起update请求restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);}
}

3.3 查询数据

查询出来别忘了单独设置id,因为我们插入source的时候没有放入id

@Override
public JobDetail findById(long id) throws IOException {// 1.    构建GetRequest请求。GetRequest getRequest = new GetRequest(JOB_IDX, id + "");// 2.   使用RestHighLevelClient.get发送GetRequest请求,并获取到ES服务器的响应。GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);// 3.    将ES响应的数据转换为JSON字符串String json = getResponse.getSourceAsString();// 4.  并使用FastJSON将JSON字符串转换为JobDetail类对象JobDetail jobDetail = JSONObject.parseObject(json, JobDetail.class);// 5.    记得:单独设置IDjobDetail.setId(id);return jobDetail;
}

3.4 删除数据

@Override
public void deleteById(long id) throws IOException {// 1.   构建delete请求DeleteRequest deleteRequest = new DeleteRequest(JOB_IDX, id + "");// 2.   使用RestHighLevelClient执行delete请求restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);}

3.5 关键字搜索

@Override
public List<JobDetail> searchByKeywords(String keywords) throws IOException {// 1.构建SearchRequest检索请求// 专门用来进行全文检索、关键字检索的APISearchRequest searchRequest = new SearchRequest(JOB_IDX);// 2.创建一个SearchSourceBuilder专门用于构建查询条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 3.使用QueryBuilders.multiMatchQuery构建一个查询条件(搜索title、jd),并配置到SearchSourceBuilderMultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "title", "jd");// 将查询条件设置到查询请求构建器中searchSourceBuilder.query(multiMatchQueryBuilder);// 4.调用SearchRequest.source将查询条件设置到检索请求searchRequest.source(searchSourceBuilder);// 5.执行RestHighLevelClient.search发起请求SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hitArray = searchResponse.getHits().getHits();// 6.遍历结果ArrayList<JobDetail> jobDetailArrayList = new ArrayList<>();for (SearchHit documentFields : hitArray) {// 1)获取命中的结果String json = documentFields.getSourceAsString();// 2)将JSON字符串转换为对象JobDetail jobDetail = JSONObject.parseObject(json, JobDetail.class);// 3)使用SearchHit.getId设置文档IDjobDetail.setId(Long.parseLong(documentFields.getId()));jobDetailArrayList.add(jobDetail);}return jobDetailArrayList;
}

3.6 分页

3.6.1 from、size

@Override
public Map<String, Object> searchByPage(String keywords, int pageNum, int pageSize) throws IOException {// 1.构建SearchRequest检索请求// 专门用来进行全文检索、关键字检索的APISearchRequest searchRequest = new SearchRequest(JOB_IDX);// 2.创建一个SearchSourceBuilder专门用于构建查询条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 3.使用QueryBuilders.multiMatchQuery构建一个查询条件(搜索title、jd),并配置到SearchSourceBuilderMultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "title", "jd");// 将查询条件设置到查询请求构建器中searchSourceBuilder.query(multiMatchQueryBuilder);// 每页显示多少条searchSourceBuilder.size(pageSize);// 设置从第几条开始查询searchSourceBuilder.from((pageNum - 1) * pageSize);// 4.调用SearchRequest.source将查询条件设置到检索请求searchRequest.source(searchSourceBuilder);// 5.执行RestHighLevelClient.search发起请求SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hitArray = searchResponse.getHits().getHits();// 6.遍历结果ArrayList<JobDetail> jobDetailArrayList = new ArrayList<>();for (SearchHit documentFields : hitArray) {// 1)获取命中的结果String json = documentFields.getSourceAsString();// 2)将JSON字符串转换为对象JobDetail jobDetail = JSONObject.parseObject(json, JobDetail.class);// 3)使用SearchHit.getId设置文档IDjobDetail.setId(Long.parseLong(documentFields.getId()));jobDetailArrayList.add(jobDetail);}// 8. 将结果封装到Map结构中(带有分页信息)// a) total -> 使用SearchHits.getTotalHits().value获取到所有的记录数// b) content -> 当前分页中的数据long totalNum = searchResponse.getHits().getTotalHits().value;HashMap hashMap = new HashMap();hashMap.put("total", totalNum);hashMap.put("content", jobDetailArrayList);return hashMap;
}

3.6.2 scroll

* 第一次查询,不带scroll_id,所以要设置scroll超时时间

* 超时时间不要设置太短,否则会出现异常

* 第二次查询,SearchSrollRequest

@Override
public Map<String, Object> searchByScrollPage(String keywords, String scrollId, int pageSize) throws IOException {SearchResponse searchResponse = null;if(scrollId == null) {// 1.构建SearchRequest检索请求// 专门用来进行全文检索、关键字检索的APISearchRequest searchRequest = new SearchRequest(JOB_IDX);// 2.创建一个SearchSourceBuilder专门用于构建查询条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 3.使用QueryBuilders.multiMatchQuery构建一个查询条件(搜索title、jd),并配置到SearchSourceBuilderMultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keywords, "title", "jd");// 将查询条件设置到查询请求构建器中searchSourceBuilder.query(multiMatchQueryBuilder);// 每页显示多少条searchSourceBuilder.size(pageSize);// 4.调用SearchRequest.source将查询条件设置到检索请求searchRequest.source(searchSourceBuilder);//--------------------------// 设置scroll查询//--------------------------searchRequest.scroll(TimeValue.timeValueMinutes(5));// 5.执行RestHighLevelClient.search发起请求searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);}// 第二次查询的时候,直接通过scroll id查询数据else {SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);searchScrollRequest.scroll(TimeValue.timeValueMinutes(5));// 使用RestHighLevelClient发送scroll请求searchResponse = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);}//--------------------------// 迭代ES响应的数据//--------------------------SearchHit[] hitArray = searchResponse.getHits().getHits();// 6.遍历结果ArrayList<JobDetail> jobDetailArrayList = new ArrayList<>();for (SearchHit documentFields : hitArray) {// 1)获取命中的结果String json = documentFields.getSourceAsString();// 2)将JSON字符串转换为对象JobDetail jobDetail = JSONObject.parseObject(json, JobDetail.class);// 3)使用SearchHit.getId设置文档IDjobDetail.setId(Long.parseLong(documentFields.getId()));jobDetailArrayList.add(jobDetail);}// 8.    将结果封装到Map结构中(带有分页信息)// a) total -> 使用SearchHits.getTotalHits().value获取到所有的记录数// b) content -> 当前分页中的数据long totalNum = searchResponse.getHits().getTotalHits().value;HashMap hashMap = new HashMap();hashMap.put("scroll_id", searchResponse.getScrollId());hashMap.put("content", jobDetailArrayList);return hashMap;
}

3.7 高亮查询

1)高亮配置

// 设置高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("title");
highlightBuilder.field("jd");
highlightBuilder.preTags("<font color='red'>");
highlightBuilder.postTags("</font>");

2)需要将高亮的字段拼接在一起,设置到实体类中

取高亮数据时需要判断高亮字段是否为空;如果你根据两个字段去查询关键字,那不一定两个字段都会存在关键字。

// 设置高亮的一些文本到实体类中
// 封装了高亮
Map<String, HighlightField> highlightFieldMap = documentFields.getHighlightFields();
HighlightField titleHL = highlightFieldMap.get("title");
HighlightField jdHL = highlightFieldMap.get("jd");if(titleHL != null) {// 获取指定字段的高亮片段Text[] fragments = titleHL.getFragments();// 将这些高亮片段拼接成一个完整的高亮字段StringBuilder builder = new StringBuilder();for(Text text : fragments) {builder.append(text);}// 设置到实体类中jobDetail.setTitle(builder.toString());
}if(jdHL != null) {// 获取指定字段的高亮片段Text[] fragments = jdHL.getFragments();// 将这些高亮片段拼接成一个完整的高亮字段StringBuilder builder = new StringBuilder();for(Text text : fragments) {builder.append(text);}// 设置到实体类中jobDetail.setJd(builder.toString());
}

Java API操作ES相关推荐

  1. es java_JAVA API操作ES详解

    一:运行环境 JDK:1.8 ES:5.6.4 二:JAVA依赖环境 elasticsearch.jar  5.6.4版本: xsi:schemaLocation="http://maven ...

  2. 大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作

    大数据技术之_20_Elasticsearch学习_01 一 概述 1.1 什么是搜索? 1.2 如果用数据库做搜索会怎么样? 1.3 什么是全文检索和 Lucene? 1.4 什么是 Elastic ...

  3. 大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作...

    一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 ...

  4. 2021年大数据ZooKeeper(五):ZooKeeper Java API操作

    目录 ZooKeeper Java API操作 引入maven坐标 节点的操作 ZooKeeper Java API操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端 ...

  5. Kafka系列三 java API操作

    使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  6. Hadoop详解(四):HDFS shell操作和Java API操作

    1. HDFS环境准备 1.1 HDFS的格式化与启动 HDFS配置完之后就可以对其进行格式化操作.在NameNode所在机器上执行如下命令进行HDFS的格式化操作: hadoop namenode ...

  7. Windows下使用Java API操作HDFS的常用方法

    场景 Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...

  8. Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS

    场景 HDFS的访问方式之HDFS shell的常用命令: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119351218 在上 ...

  9. 使用 Java API 操作 HBase

    使用 Java API 操作 HBase 数据库,就类似HBase Shell,本质上一个是Java 代码,一个是Shell 命令.(hadoop 的文件系统莫不如此,可用Java API 的方式操作 ...

最新文章

  1. ceph nautilus相对于minic的主要改动
  2. 【布局】圣杯布局双飞翼布局
  3. win下我的windows键失效了
  4. C++对象模型7——类的成员函数、反汇编虚析构函数、RTTI、多态的开销
  5. RAISE_APPLICATION_ERROR用法
  6. Android Activity 以及 Application 生命周期
  7. java的read()_Java Reader read()方法
  8. 服务器win2008修复安装,Win2008 R2迁移实战之迁移工具安装
  9. Java死锁、活锁,悲观锁、乐观锁
  10. golang程序如何优雅地退出
  11. mysql 5.7 sql mode_MySQL 5.7版本sql_mode=only_full_group_by问题
  12. Java反射机制--反射概述
  13. 主流PCB画图软件的对比区别(AD、Pads、Allegro)
  14. linux用独显运行steam,如何使用Steam Play在Linux上玩几乎所有Windows游戏 | MOS86
  15. 2021年高处安装、维护、拆除考试及高处安装、维护、拆除考试技巧
  16. ERC-3525 通过倒计时|SFT 是什么?有什么用?
  17. Linux之网络管理
  18. linux——signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT...........................)
  19. html版电子表,秒表,倒计时
  20. eclipse 3.7 中英文自由切换

热门文章

  1. 每日一练1.直接排序法
  2. java异常处理机制
  3. 第四次作业类测试代码+108+曾宏宇
  4. 苹果 python 返回32512_(FOCUS)有容量限制的 VRP 模型的分支切割法的实现 by python3 Gurobi...
  5. 平平淡淡从从容容才是真?
  6. 第一章 Oracle介绍
  7. 淘宝静态页面html+css部分
  8. 用HTML加CSS模仿的W3school的主页
  9. 深入浅出ModbusTcp
  10. PHP使用openoffice实现word,ppt,Excel在线转PDF浏览。windows和linux系统不同的解决方案