热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JAVA利用RestHighLevelClient设计接口实现es的基本增删改查及登录认证、中文分词的结果返回

背景之前写过一篇《java使用transportClient连接elasticsearch并做接口实现增删改查ES6.4.3版本》的文章,在项目中可以作为基本的使用。

背景

之前写过一篇《java使用transportClient连接elasticsearch并做接口实现增删改查ES6.4.3版本》的文章,在项目中可以作为基本的使用。但是没有权限验证及分词的处理。在资料查找中,发现TransportClien客户端工具会在之后的版本中作废。且实践中6.4.3版本无法对账密验证(可能方式不对)。遂改造成了RestHighLevelClient客户端实现之前的功能。主要逻辑都差不多。这里做个整理

  1. 引入相关包
  2. 定义接口
  3. 接口实现
  4. es对象的实例化处理
  5. 分词测试

pom配置相关包
我这里把涉及到的核心包整理,方便拷贝


org.springframeworkspring-beans3.1.2.RELEASEcom.alibabafastjson1.2.28junitjunit3.8.1testorg.elasticsearchelasticsearch6.4.3org.elasticsearch.clienttransport6.4.3org.elasticsearchelasticsearch-core6.4.3compileorg.elasticsearchelasticsearch-secure-sm6.4.3compileorg.elasticsearchelasticsearch-x-content6.4.3compileorg.apache.lucenelucene-core7.4.0compileorg.apache.lucenelucene-analyzers-common7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-backward-codecs7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-grouping7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-queriesorg.apache.lucenelucene-highlighter7.4.0compileorg.apache.lucenelucene-analyzers-commonorg.apache.lucenelucene-coreorg.apache.lucenelucene-joinorg.apache.lucenelucene-memoryorg.apache.lucenelucene-queriesorg.apache.lucenelucene-join7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-memory7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-misc7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-queries7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-queryparser7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-queriesorg.apache.lucenelucene-sandboxorg.apache.lucenelucene-sandbox7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-spatial7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-spatial-extras7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-spatial3dio.sgrs2-geometry-library-javaorg.locationtech.spatial4jspatial4jorg.apache.lucenelucene-spatial3d7.4.0compileorg.apache.lucenelucene-coreorg.apache.lucenelucene-suggest7.4.0compileorg.apache.lucenelucene-analyzers-commonorg.apache.lucenelucene-coreorg.elasticsearchelasticsearch-cli6.4.3compilecom.carrotsearchhppc0.7.1compilejoda-timejoda-time2.10compilecom.tdunningt-digest3.2compileorg.hdrhistogramHdrHistogram2.1.9compileorg.locationtech.spatial4jspatial4j0.7compiletrueorg.locationtech.jtsjts-core1.15.0compiletrueorg.apache.logging.log4jlog4j-api2.11.1compileorg.apache.logging.log4jlog4j-core2.11.1compileorg.apache.logging.log4jlog4j-apitrueorg.apache.logging.log4jlog4j-1.2-api2.11.1compileorg.apache.logging.log4jlog4j-coreorg.apache.logging.log4jlog4j-apitrueorg.elasticsearchjna4.5.1compile org.elasticsearch.clientelasticsearch-rest-high-level-client6.4.2 org.elasticsearch.clientelasticsearch-rest-client6.4.2org.springframeworkspring-test3.1.2.RELEASEtestorg.springframeworkspring-context3.1.2.RELEASEtestjunitjunit4.12testorg.slf4jslf4j-api1.7.7

接口定义
和之前相比,多了个分词结果返回接口

package com.kaishiba.elasticsearch.service;import java.util.List;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;public abstract interface ElasticsearchService
{public abstract RestHighLevelClient getRestHighLevelClient()throws Exception;public abstract SearchResponse getSearchResult(SearchRequest paramSearchRequest)throws Exception;public abstract SearchResponse getSearchResult(String paramString1, String paramString2, SearchSourceBuilder paramSearchSourceBuilder)throws Exception;public abstract SearchResponse getSearchResult(String paramString1, String paramString2, Integer paramInteger1, Integer paramInteger2, String paramString3, QueryBuilder paramQueryBuilder, AggregationBuilder paramAggregationBuilder)throws Exception;public abstract boolean updateIndexRequest(String paramString1, String paramString2, String paramString3, String paramString4)throws Exception;public abstract boolean deleteIndex(String paramString1, String paramString2, String paramString3)throws Exception;public abstract List getAnalyze(String paramString)throws Exception;
}

接口实现及认证设置

package com.kaishiba.elasticsearch.service.impl;import java.util.ArrayList;
import java.util.List;import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.InitializingBean;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.kaishiba.elasticsearch.service.ElasticsearchService;/*** es通用化组件方法实现* @author chenhailong* @date 2019年8月12日 上午9:59:23*/
public class ElasticsearchServiceImplimplements ElasticsearchService, InitializingBean
{private String ip;private int port;private String userName;private String userPwd;private RestHighLevelClient client;public String getIp(){return this.ip;}public void setIp(String ip){this.ip = ip;}public int getPort(){return this.port;}public void setPort(int port){this.port = port;}public String getUserPwd(){return this.userPwd;}public void setUserPwd(String userPwd){this.userPwd = userPwd;}public String getUserName(){return this.userName;}public void setUserName(String userName){this.userName = userName;}public RestHighLevelClient getRestHighLevelClient(){return this.client;}public SearchResponse getSearchResult(SearchRequest request)throws Exception{return this.client.search(request, RequestOptions.DEFAULT);}public SearchResponse getSearchResult(String indexName, String typeName, SearchSourceBuilder searchSourceBuilder)throws Exception{return this.client.search(new SearchRequest().indices(new String[] { indexName }).types(new String[] { typeName }).source(searchSourceBuilder), RequestOptions.DEFAULT);}public SearchResponse getSearchResult(String indexName, String typeName, Integer page, Integer pageSize, String sortDesc, QueryBuilder queryBuilder, AggregationBuilder aggregationBuilder)throws Exception{return this.client.search(new SearchRequest().indices(new String[] { indexName }).types(new String[] { typeName }).source(new SearchSourceBuilder().query(queryBuilder).from(page.intValue() * pageSize.intValue()).size(pageSize.intValue()).sort(sortDesc, SortOrder.DESC).aggregation(aggregationBuilder)), RequestOptions.DEFAULT);}public boolean updateIndexRequest(String indexName, String typeName, String id, String jsonStr)throws Exception{IndexRequest createRequest = new IndexRequest(indexName, typeName, id);createRequest.source(jsonStr, XContentType.JSON);UpdateRequest updateRequest = new UpdateRequest(indexName, typeName, id);updateRequest.doc(jsonStr, XContentType.JSON).upsert(createRequest);UpdateResponse updateResponse = this.client.update(updateRequest, RequestOptions.DEFAULT);if ((updateResponse.getResult().getLowercase().equals("updated")) || (updateResponse.getResult().getLowercase().equals("created"))) {return true;}return false;}public boolean deleteIndex(String indexName, String typeName, String id)throws Exception{DeleteRequest deleteRequest = new DeleteRequest(indexName, typeName, id);DeleteResponse deleteResponse = this.client.delete(deleteRequest, RequestOptions.DEFAULT);if (deleteResponse.getResult().getLowercase().equals("deleted")) {return true;}return false;}public List getAnalyze(String text)throws Exception{List list = new ArrayList();text = text.length() > 100 ? text.substring(0, 100) : text;Request request = new Request("GET", "_analyze");JSONObject entity = new JSONObject();entity.put("analyzer", "ik_max_word");entity.put("text", text);request.setJsonEntity(entity.toJSONString());Response response = this.client.getLowLevelClient().performRequest(request);JSONObject tokens = JSONObject.parseObject(EntityUtils.toString(response.getEntity()));JSONArray arrays = tokens.getJSONArray("tokens");for (int i = 0; i }

spring bean配置如下




写个测试类如下
注:ik分词需要下载对应版本的分词插件‘elasticsearch-analysis-ik-6.4.2’,装好之后可以进行如下操作

/** Copyright 2016 kaistart.com All right reserved. This software is the* confidential and proprietary information of kaistart.com ("Confidential* Information"). You shall not disclose such Confidential Information and shall* use it only in accordance with the terms of the license agreement you entered* into with kaistart.com.*/
package com.kaishiba.elasticsearch.test;import java.util.List;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.kaishiba.elasticsearch.service.ElasticsearchService;/*** @author chenhailong* @date 2019年8月12日 上午10:07:11 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:/spring-es.xml"})
public class App {@Autowiredprivate ElasticsearchService es;@Testpublic void getInfo() {try {List ls = es.getAnalyze("中华人民共和国合同法");for(String s: ls) {System.out.println("listing key :" + s);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

返回结果如下:

listing key :中华人民共和国
listing key :中华人民
listing key :中华
listing key :华人
listing key :人民共和国
listing key :人民
listing key :共和国
listing key :共和
listing key :国合
listing key :合同法
listing key :合同
listing key :法

当修改为错误的账号密码之后,运行以下代码依然正常

@Test
public void get() {
Request request = new Request("GET","/");
try {System.out.println(es.getRestHighLevelClient().getLowLevelClient().performRequest(request));
} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();
}
}# Response{requestLine=GET / HTTP/1.1, host=http://127.0.0.1:9200, response=HTTP/1.1 200 OK}

这是由于没有安装 x-pack插件,参考详情查看
《单独安装elasticsearch6.x并破解xpack开启SSL认证进行测试使用》

《elasticsearch6.4.2安装x-pack安全认证后,java如何使用transportclient连接/resthighlevelclient连接》


推荐阅读
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • MicrosoftDeploymentToolkit2010部署培训实验手册V1.0目录实验环境说明3实验环境虚拟机使用信息3注意:4实验手册正文说 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • 通过 CSS 中的 transition 属性,可以轻松实现元素状态变化时的平滑过渡效果。本文将详细介绍如何使用 transition 属性,并提供一个具体的示例。 ... [详细]
author-avatar
qzq9037091
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有