Elasticsearch Java API四种实现方式

2023-11-15

0、题记

之前Elasticsearch的应用比较多,但大多集中在关系型、非关系型数据库与Elasticsearch之间的同步。以上内容完成了Elasticsearch所需要的基础数据量的供给。但想要在海量的数据中找到和自己相关的业务数据,实现对已有的数据实现全文检索、分类统计等功能并应用到业务系统中,必须借助Java API来实现。

1、Elasticsearch Java API 概览

Elasticsearch Java API 相关使用研究结果:

1.1 国内的博文讲解Elasticsearch Java API 大多偏重于实现,没有对Elasticsearch Java API 整体进行讲解。这样的问题是头疼医头,脚痛医脚,始终不得原理。

1.2 Elasticsearch1.X,2.X,5.X随着版本的迭代,除了系统升级,Java API也做了相对较大的调整。

也就是说,1.X的API在2.X以及5.X乃至未来6.X版本都不是通用的。如1.x的fuzzyLikeThisQuery在后续版本都不再存在。

1.3 Elasticsearch官网Java API提供了相对丰富的解读。(文末参考给出了官网地址)

1.4 Elasticsearch Java API 大致分如下四类:

1.4.1、TransportClient

步骤1:获取client; 
步骤2:执行对应的增、删、改、查操作。

查询使用参考(以下我已经验证过,好用ok):

/**
* Query Search
* @param index
* @param type
* @param term
* @param queryString
*/
private static void querySearch(String index, String type,String term,String queryString){
Client client = createTransportClient();
SearchResponse response = client.prepareSearch(index)
  .setTypes(type)
  // 设置查询类型
// 1.SearchType.DFS_QUERY_THEN_FETCH = 精确查询
// 2.SearchType.SCAN = 扫描查询,无序
// 3.SearchType.COUNT = 不设置的话,这个为默认值,还有的自己去试试吧
  .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
  // 设置查询关键词
  .setQuery(QueryBuilders.matchQuery(term, queryString))
  .addHighlightedField(term)
  .setHighlighterPreTags("<em>")
  .setHighlighterPostTags("</em>")
  // 设置查询数据的位置,分页用
.setFrom(0)
// 设置查询结果集的最大条数
.setSize(60)
// 设置是否按查询匹配度排序
.setExplain(true)
// 最后就是返回搜索响应信息
  .execute()
  .actionGet();
SearchHits searchHits = response.getHits();
System.out.println("-----------------在["+term+"]中搜索关键字["+queryString+"]---------------------");
System.out.println("共匹配到:"+searchHits.getTotalHits()+"条记录!");
SearchHit[] hits = searchHits.getHits();
for (SearchHit searchHit : hits) {
//获取高亮的字段
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
HighlightField highlightField = highlightFields.get(term);
System.out.println("高亮字段:"+highlightField.getName()+"\n高亮部分内容:"+highlightField.getFragments()[0].string());
Map<String, Object> sourceAsMap = searchHit.sourceAsMap();
Set<String> keySet = sourceAsMap.keySet();
for (String string : keySet) {
//key value 值对应关系
System.out.println(string+":"+sourceAsMap.get(string));
}
System.out.println();
}
}

1.4.2、RestClient

elasticsearch 5.0引入了一个新的客户端 RestClient ,使用HTTP API elasticsearch代替内部协议。这需要更少依赖关系。你也不需要关注那么多版本,当前客户端也可以用于elasticsearch 2.x版本。

使用参考如下(以下我没有代码验证):

HttpEntity entity = new NStringEntity(
      "{ \"query\": { \"match_all\": {}}}",
      ContentType.APPLICATION_JSON);
  // alternative: performRequestAsync
  Response response = restClient.performRequest("POST",                                     "/_search", emptyMap(), entity);
  String json = toString(response.getEntity());
  // ...

1.4.3、Jest

Jest是ElasticSearch的Java HTTP Rest客户端。 Jest填补了 ElasticSearch 缺少 Http Rest接口 客户端的空白。 
通过Maven编译实现,需要设定好不同的版本。现在pom.xml最新的Elasticsearch版本为5.3.3(2017年5月27日),5.3.3的API向ES2.3.4插入索引数据,不能保障数据正常插入,且没有报错。

具体使用参考(以下示例跑通,验证ok):

/**
* @brief:全文检索入口
* @throws Exception
*/
private static void fullTextQuery(String queryString) throws Exception {
JestClient jestClient = JestExample.getJestClient();   //工厂模式实现
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.queryStringQuery(queryString));

Search search = new Search.Builder(searchSourceBuilder.toString())
// .addIndex("article")
.build();
SearchResult result = jestClient.execute(search);
System.out.println(result.getJsonString());
}
1.4.3.1 Jest介绍

Jest是Elasticsearch 的Java Http Rest 客户端。

ElasticSearch已经具备应用于Elasticsearch内部的Java API,但是Jest弥补了ES自有API缺少Elasticsearch Http Rest接口客户端的不足。

1.4.3.2、 Jest优势概括如下:

1)提供Restful API, 原生ES API不具备;

2)若ES集群使用不同的ES版本,使用原生ES API会有问题,而Jest不会;

3) 更安全(可以在Http层添加安全处理)。

1.4.3.3、pom

概括下,Jest使用maven的方式管理项目。支持最新的Elasticsearch。 
pom.xml有相关配置信息。(默认是最新ES版本相关的pom.xml,截止:2017-08-13 16:38, 其默认支持版本5.3.2)。

<dependency>

  <groupId>io.searchbox</groupId>
  <artifactId>jest</artifactId>
  <version>2.0.0</version>
</dependency>

高版本ES也是可以使用的,我实际开发ES5.4.0,用的JEST的做的后端接口开发。

1.4.3.4、Jest使用

这里写图片描述

1.4.3.5、实战Jest干货

https://github.com/ameizi/elasticsearch-jest-example/blob/master/src/main/java/net/aimeizi/client/elasticsearch/TransportClient.java

1.4.3.6、Jest相关下载

Jest github地址:https://github.com/searchbox-io/Jest


1.4.4、Spring Data Elasticsearch

可参考https://blog.csdn.net/qq_33314107/article/details/80725994

2、小结

1)以上API的调用方式各有利弊,具体根据开发实际情况做出选择。 
2)具体Java API的 TransportClient 方式与Jest方式的增、删、改、查操作,可以参考(下附4)。 
3)ES的实践开发还有很长的路要走,尤其分布式部署、原理、出现问题排查、高效检索 Java API的运用等。

3、参考

1)、API对比:http://blog.florian-hopf.de/2016/11/java-clients-elasticsearch.html 
2)、官网API地址:https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.3/index.html 
3)、Jest地址:https://github.com/searchbox-io/Jest 

4)、代码示例:https://github.com/ameizi/elasticsearch-jest-example

转载自https://blog.csdn.net/laoyang360/article/details/72793210

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Elasticsearch Java API四种实现方式 的相关文章

  • 全文搜索 DynamoDB

    以下情况 我正在为我的客户将元素存储在 DyanmoDb 中 HashKey 是元素 ID Range Key 是客户 ID 除了这些字段之外 我还存储一个字符串数组 gt 标签 例如 Pets House 和多行文本 我想在我的应用程序中
  • 在弹性搜索中使用 GET/POST 时的不同结果

    我正在通过 Elastic Search Head 插件尝试弹性搜索 当我通过 POST 提交查询时 结果符合预期 但是 当我使用 GET 尝试相同的查询时 我总是会返回索引中的所有值 那么 如何通过 GET 将查询传递到弹性搜索服务器 以
  • Nest Elastic - 构建动态嵌套查询

    我必须使用 Nest 查询嵌套对象 但是查询是以动态方式构建的 下面的代码演示了以静态方式对嵌套 书籍 进行查询 QueryContainer qry qry new QueryStringQuery DefaultField name D
  • 弹性搜索 - search_after 参数

    我读了这个doc https www elastic co guide en elasticsearch reference 5 0 search request search after html要理解 search after 并有两个
  • 从 node.js 创建对 AWS ES 实例的有效签名请求

    我试图找到一个示例 说明如何连接到 Node js 中的 AWS ES 实例 然后通过一个简单的请求访问 ES 集群 我正在尝试使用elasticsearch节点包 https www npmjs com package elasticse
  • Elasticsearch 关于“空索引”的查询

    在我的应用程序中 我使用了几个elasticsearch索引 它们在初始状态下不包含索引文档 我认为这可以称为 空 该文档的映射是正确且有效的 该应用程序还有一个包含实体的关系数据库 这些实体可能具有在 elasticsearch 中关联的
  • 尝试在 ElasticSearch 中查询和聚合,但聚合不起作用 - elasticsearch.js 客户端

    我尝试查询我的数据集有两个目的 匹配一个术语 可转售 true 按价格对结果进行排序 最低到最高 数据集 文档是 data resellable true startingPrice 0 id 4emEe r x5DRCc5 buyNowP
  • 如何增加vm.max_map_count?

    我正在尝试在 Ubuntu EC2 计算机 t2 medium 中运行弹性搜索 但我收到消息 最大虚拟内存区域 vm max map count 65530 太低 至少增加到 262144 我怎样才能增加vm max map count v
  • Elasticsearch Nest 通配符查询(带空格)

    简洁版本 我想使用 Nest 编写一个弹性搜索查询来获取完整的索引项 ContentIndexables在我的例子中作为我的自定义类型 已被索引 该查询受 some string 术语查询的约束 即 String StartsWith 其中
  • 如何使用scala获取elasticsearch中_delete_by_query api的状态

    我正在 scala 中向 elasticsearch 发送 HTTP post Http s http elkIp 5051 indexName delete by query postData s query terms zip id k
  • 设置 verify_certs=False 但 elasticsearch.Elasticsearch 因证书验证失败而引发 SSL 错误

    self host KibanaProxy 自我端口 443 self user 测试 self password 测试 我需要禁止证书验证 使用选项时它与curl一起使用 k在命令行上 但是 在使用 Elasticsearch pytho
  • Elasticsearch:预期的字段名称,但得到了 START_OBJECT

    我一直在尝试运行以下查询 但每次运行时都会收到以下错误 nested ElasticsearchParseException Expected field name but got START OBJECT field value fact
  • AWS ElasticSearch Service - 从 CF 模板设置加密选项

    我正在创建一个云形成模板来在AWS中配置elasticsearch服务域 我想将加密下的此属性设置为 true 域的所有流量都需要 HTTPS 但我无法在 AWS 文档中找到执行此操作的方法 用于设置加密属性的其他选项 例如 启用静态数据加
  • 使用文件的 AWS Elasticsearch 同义词

    我正在尝试使用文件将同义词添加到弹性搜索 如本链接所示 但它给了我以下错误https www elastic co guide en elasticsearch reference 5 2 analysis synonym tokenfil
  • 在elasticsearch中转义特殊字符

    我正在使用Elasticsearch python 客户端 https elasticsearch py readthedocs io en master 对我们托管的 elasticsearch 实例进行一些查询 我注意到一些字符需要转义
  • 将 CSV 文件中的数字数据更改为文本

    下面的查询是抓取数据并创建一个 CSV 文件 我遇到的问题是名为 SPLE 的源在数据库中存储数字为 0 1 50 的数据 然而 在 CSV 中 这些数字被收集在 CSV 中 我希望在创建 CSV 时 这些数字能够代表诸如以下的单词 0 T
  • 在 ElasticSearch 中,我应该对单独但相关的实体使用多个索引吗?

    添加索引的开销有详细记录 但我无法找到有关何时针对要建立索引的各种文档类型使用多个索引的良好信息 这是一个说明问题的通用示例 假设我们有以下实体 产品 名称 产品 ID 产品类别 ID 商店列表 产品类别 名称 ProductCategor
  • Elasticsearch 日期范围交集

    我在弹性搜索中存储类似以下信息的信息 timeslot start at 2013 02 01 timeslot end at 2013 02 03 鉴于我有另一个日期范围 例如 从用户输入给出 我想搜索相交的时间范围 与此类似 确定两个日
  • 使用 python 聚合 elasticsearch-dsl 中的字段

    有人可以告诉我如何编写 Python 语句来聚合 求和和计数 有关我的文档的内容吗 SCRIPT from datetime import datetime from elasticsearch dsl import DocType Str
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport

随机推荐

  • vue elementUi便利el-form-item配置校验

  • 了解一款新的单片机

    MCU价格依然高居不下 各个国产MCU厂商的竞争也是如火如荼 然而好多厂商都是追求硬件甚至软件兼容STM32 但是兼容性好的芯片用的人也多 最终供不应求 还是会导致价格上涨 与其这样 不如干脆选一款相对冷门的单片机 用的人没那么多 价格也就
  • 机器学习第一周(一)--机器学习引入

    机器学习 监督学习 无监督学习 机器学习 1 机器学习算法主要分为俩大类 监督学习 Supervised Learning 和无监督学习 Unsupervised Learning 监督学习与无监督学习一个最大不同是监督学习的数据是带标签的
  • 调用百度地图5.0出现java.lang.UnsatisfiedLinkError: No implementation found for int

    转载请注明 http blog csdn net seven2729 article details 48289101 调用百度地图 5 0手机报错 黑屏并闪退 报错日志 java lang UnsatisfiedLinkError No
  • java——SpringBoot后台Controller接收数组参数

    1 前台传数组 var ids 1 2 3 4 5 6 ajax url postArray type post dateType json data ids ids success function res console log 数据
  • 状态码415解决

    状态码415 状态码415这是个什么鬼 常见的转态码 是200 204 206 301 302 303 304 400 401 403 404 405 500 503这个HTTP 协议原生的状态码 自己项目封装指定的那就另当别论 415很少
  • git报错“remote: HTTP Basic: Access denied”的解决方法

    使用git推送项目代码或者下载项目代码时出现报错 remote HTTP Basic Access denied 很多时候都是由于用户名和密码没有和注册所填信息保持一致造成的 解决方法是首先在git中输入 git config system
  • IC学习笔记6——单比特信号的跨时钟域处理方法之“打两拍”

    一 打两拍 对于单比特信号的跨时钟域处理问题 通常使用两级的寄存器来同步源寄存器的信号 这样的方法简称打两拍 1 1 电路波形图 如上图所示从源寄存器传递过来的信号adata没有满足目的寄存器的建立和保持时间 发生亚稳态 但是绝大多数的时候
  • 一行代码搞定Http请求,强得离谱~

    大家好 我是乔哥 OKHttpUtil 在Java的世界中 Http客户端之前一直是Apache家的HttpClient占据主导 但是由于此包较为庞大 API又比较难用 因此并不使用很多场景 而新兴的OkHttp Jodd http固然好用
  • jenkins配置测试邮件发送成功但构建邮件发送失败

    以下失败原因只是其中之一 每个人遇到的可能并不一样 希望本文能提供解决思路 在配置jenkins发送邮件的时候按照网上查询的各个步骤配置完毕 邮件测试也可以发送成功 但是当进行项目构建时 日志提示邮件已经发送 但实际并未收到邮件 使用的是Q
  • git clone 下载 其他分支

    总是记不住 可能是因为用得少 如果 已经 clone了 master分支 方法 1 那么 本地 git pull 然后执行 git checkout b 本地分支名 origin 远程分支名 这样就能下载 到远程分支 并建立本地关联 方法2
  • 【模拟】不高兴的津津

    题目 不高兴的津津 rqnoj20 题目描述 津津上初中了 妈妈认为津津应该更加用功学习 所以津津除了上学之外 还要参加妈妈为她报名的各科复习班 另外每周妈妈还会送她去学习朗诵 舞蹈和钢琴 但是津津如果一天上课超过八个小时就会不高兴 而且
  • loadrunner agent process进程

    LoadRunner Agent Processer是LR的代理进程 有很大的用处 比如当一台机器要分担一定 负载的时候 这个LoadRunner Agent Processer是必须启动的 在LR安装后一般是开机启动的 可以关掉 就象个地
  • git 使用总结

    1 本地安装git 略 2 创建github账号 略 3 本地配置 配置用户名和邮箱 git config global user name xiaobuisme git config global user email 81954469
  • Codemonkey 编码冒险课程

    转自 https blog csdn net mmh19891113 article details 80704745 Codemonkey 编码冒险课程 1 200 关卡 我们并没有按照他们官方的来划分关卡 官方是1 100 101 20
  • 在struts框架下实现文件的上传

    由于jspsmartupload上传文件 当前端页面没有file控件时 后端用jspsmartupload控件upload时将会走入一个死循环 现在采用struts自己提供的功能实现文件的上传 1 前端页面upload jsp
  • 使用Process Monitor工具监测进程对注册表和文件的操作

    使用Process Monitor工具监测进程对注册表和文件的操作 在C C 中编写代码实现 Process Monitor是一款功能强大的Windows系统工具 它可以用于监测和记录系统中的进程对注册表和文件的操作 通过使用Process
  • SQL注入攻击介绍

    SQL注入攻击介绍 一 SQL注入攻击简介 SQL注入攻击是指 后台数据库操作时 如果拼接外部参数到SQL语句中 就可能导致欺骗服务器执行恶意的SQL语句 造成数据泄露 删库 页面篡改等严重后果 按变量类型分为 数字型 字符型 按HTTP提
  • tomcat开启远程管理Manager

    启动tomcat 点击Manager App 403错误 根据提示 有两个地方需要修改 一个是开启允许远程访问 否则只能本机访问 另一个是打开manager gui 添加用户权限 1 开启远程访问 两种方式 a 打开若没有则新建 conf
  • Elasticsearch Java API四种实现方式

    0 题记 之前Elasticsearch的应用比较多 但大多集中在关系型 非关系型数据库与Elasticsearch之间的同步 以上内容完成了Elasticsearch所需要的基础数据量的供给 但想要在海量的数据中找到和自己相关的业务数据