Java API操作ES
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相关推荐
- es java_JAVA API操作ES详解
一:运行环境 JDK:1.8 ES:5.6.4 二:JAVA依赖环境 elasticsearch.jar 5.6.4版本: xsi:schemaLocation="http://maven ...
- 大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作
大数据技术之_20_Elasticsearch学习_01 一 概述 1.1 什么是搜索? 1.2 如果用数据库做搜索会怎么样? 1.3 什么是全文检索和 Lucene? 1.4 什么是 Elastic ...
- 大数据技术之_20_Elasticsearch学习_01_概述 + 快速入门 + Java API 操作 + 创建、删除索引 + 新建、搜索、更新删除文档 + 条件查询 + 映射操作...
一 概述1.1 什么是搜索?1.2 如果用数据库做搜索会怎么样?1.3 什么是全文检索和 Lucene?1.4 什么是 Elasticsearch?1.5 Elasticsearch 的适用场景1.6 ...
- 2021年大数据ZooKeeper(五):ZooKeeper Java API操作
目录 ZooKeeper Java API操作 引入maven坐标 节点的操作 ZooKeeper Java API操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端 ...
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- Hadoop详解(四):HDFS shell操作和Java API操作
1. HDFS环境准备 1.1 HDFS的格式化与启动 HDFS配置完之后就可以对其进行格式化操作.在NameNode所在机器上执行如下命令进行HDFS的格式化操作: hadoop namenode ...
- Windows下使用Java API操作HDFS的常用方法
场景 Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- Windows下配置Hadoop的Java开发环境以及用Java API操作HDFS
场景 HDFS的访问方式之HDFS shell的常用命令: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119351218 在上 ...
- 使用 Java API 操作 HBase
使用 Java API 操作 HBase 数据库,就类似HBase Shell,本质上一个是Java 代码,一个是Shell 命令.(hadoop 的文件系统莫不如此,可用Java API 的方式操作 ...
最新文章
- ceph nautilus相对于minic的主要改动
- 【布局】圣杯布局双飞翼布局
- win下我的windows键失效了
- C++对象模型7——类的成员函数、反汇编虚析构函数、RTTI、多态的开销
- RAISE_APPLICATION_ERROR用法
- Android Activity 以及 Application 生命周期
- java的read()_Java Reader read()方法
- 服务器win2008修复安装,Win2008 R2迁移实战之迁移工具安装
- Java死锁、活锁,悲观锁、乐观锁
- golang程序如何优雅地退出
- mysql 5.7 sql mode_MySQL 5.7版本sql_mode=only_full_group_by问题
- Java反射机制--反射概述
- 主流PCB画图软件的对比区别(AD、Pads、Allegro)
- linux用独显运行steam,如何使用Steam Play在Linux上玩几乎所有Windows游戏 | MOS86
- 2021年高处安装、维护、拆除考试及高处安装、维护、拆除考试技巧
- ERC-3525 通过倒计时|SFT 是什么?有什么用?
- Linux之网络管理
- linux——signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT...........................)
- html版电子表,秒表,倒计时
- eclipse 3.7 中英文自由切换
热门文章
- 每日一练1.直接排序法
- java异常处理机制
- 第四次作业类测试代码+108+曾宏宇
- 苹果 python 返回32512_(FOCUS)有容量限制的 VRP 模型的分支切割法的实现 by python3 Gurobi...
- 平平淡淡从从容容才是真?
- 第一章 Oracle介绍
- 淘宝静态页面html+css部分
- 用HTML加CSS模仿的W3school的主页
- 深入浅出ModbusTcp
- PHP使用openoffice实现word,ppt,Excel在线转PDF浏览。windows和linux系统不同的解决方案