es8.x 版本使用及 java api client

news/2024/11/21 0:32:57/文章来源:https://www.cnblogs.com/guanbin-529/p/18289156

1.为什么不使用High Level REST Client 了

那在 ElasticSearch 7.15.0 版本开始,官方又不建议使用 High Level REST Client 了,为什么呢?因为它是基于原生的 REST API,而这些 API 在某些情况下限制了某些功能的性能优化。与此同时,官方也推出了 Elasticsearch Java 客户端(Java 客户端)作为替代方案。这个新客户端旨在提供更好的性能、更好的稳定性,并且更易于维护和开发。

缺点如下:

    1.性能损耗:由于是基于 REST API 的封装,可能存在性能上的一些损耗,比如相比原生的 Java 客户端可能有更高的延迟。
    2.功能限制:High Level REST Client 对于一些高级或较新的功能可能提供支持不够或者存在一些限制。

优点如下:

    1.易用性高:High Level REST Client 封装了底层的 REST API,提供了了更直观、更易用的开发方法调用 ElasticSearch 的功能。
    2.开发效率高
    3.较好的兼容性
虽然 High Level REST Client 在易用性和开发效率方面有优势,但是为了获得更好的性能、更好的稳定性,并且获得更多的特性支持,官方建议从 Elasticsearch 7.15.0 版本开始,使用新的 Java 客户端

 

2.使用 java client 步骤

 

1. pom 引入

        <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.14.1</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.17.0</version></dependency>

2. 创建 java 客户端

 String serverUrl = "http://localhost:9200";String apiKey = "wM7endtMl1d=U+oJdWFH"; //访问 es 的密钥// Create the low-level clientRestClient restClient = RestClient.builder(HttpHost.create(serverUrl)).setDefaultHeaders(new Header[]{new BasicHeader("Authorization", "ApiKey " + apiKey)}).build();// Create the transport with a Jackson mapperElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient elasticsearchClient = new ElasticsearchClient(transport);

3. 创建索引

创建一个索引名为“es_2024”的索引

public static void createIndex(ElasticsearchClient esClient) throws IOException {User user = new User("1", "test", 10, "A", new Date(), "123456789", "123@qq.com", "北京");IndexResponse response = esClient.index(i -> i.index("es_2024").id(user.getId()).document(user));System.out.println("Indexed with version " + response.version());}

效果

4. 查询

下面是查询姓名包含李的,且年龄大于等于2岁的人员信息

private static void extracted2(ElasticsearchClient esClient) throws IOException {String searchText = "李";int age = 2;Query byName = MatchQuery.of(m -> m.field("name").query(searchText))._toQuery();Query byMaxPrice = RangeQuery.of(r -> r.field("age").gte(JsonData.of(age))//大于等于)._toQuery();SearchResponse<User> response = esClient.search(s -> s.index("es_2024").query(q -> q.bool(b -> b.must(byName).must(byMaxPrice))),User.class);List<Hit<User>> hits = response.hits().hits();for (Hit<User> hit : hits) {User user = hit.source();System.out.println("Found user " + user.getName() + ", score " + hit.score());}}

 

5. 使用脚本查询

使用脚本模版查询的好处就是,可以不用改代码,直接改模板就好了(前提需要单独创建一个模板的文件,使用时加载该模板)

 

下面是使用 mustache的一个模板

private static void userScript(ElasticsearchClient esClient) throws IOException {
// Create a scriptesClient.putScript(r -> r.id("query-script").script(s -> s.lang("mustache")// mustache 含义:mustache 模板引擎.source("{\"query\":{\"match\":{\"{{field}}\":\"{{value}}\"}}}")));SearchTemplateResponse<User> response = esClient.searchTemplate(r -> r.index("es_2024").id("query-script").params("field", JsonData.of("name")).params("value", JsonData.of("李")),User.class);List<Hit<User>> hits = response.hits().hits();for (Hit<User> hit: hits) {User user = hit.source();System.out.println("Found user " + user.getName()+ ", score " + hit.score());}}

 

6. 聚合查询

查询address=南京,并按 age 进行分组查询,此查询只查询结果,所以是 Voild

private static void aggregation(ElasticsearchClient esClient) throws IOException {String searchText = "南京";//不使用分词查询,及精确匹配Query query = TermQuery.of(m -> m.field("address.keyword").value(searchText))._toQuery();SearchResponse<Void> response = esClient.search(b -> b.index("es_2024").size(0).query(query).aggregations("group_by_age", a -> a.terms(h -> h.field("age"))),Void.class);List<LongTermsBucket> array = response.aggregations().get("group_by_age").lterms().buckets().array();for (LongTermsBucket bucket: array) {System.out.println("There are " + bucket.docCount() +" value " + bucket.key());}
}

 

因为address='南京' 且 age=2的只有一个,所以打印出来,bucket 是分组的值,bucket.docCount 是分组值对应的数量

There are 1 value 2   

 

7. 分词查询和不分词查询的注意事项

在Elasticsearch中,查询可以通过多种方式进行,包括全文查询(分词查询)和不分词查询。

全文查询(分词查询):

全文查询通常用于对文本内容进行搜索。它会先分析查询字符串,然后对分析后的词汇进行搜索。这是最常见的搜索方式,也是Elasticsearch默认的搜索方式。

例如,如果你有一个文档,其中包含"Elasticsearch is a great search engine",当你搜索"Elastic search"时,它会将这个查询分解为"Elastic"和"search",然后返回包含这两个词的文档。

GET /_search
{
  "query": {
    "match": {
      "content": "Elastic search"
    }
  }
}

不分词查询:

不分词查询用于查找完全匹配的词汇。如果你想要查找整个词(例如,整个词汇或短语),你可以使用不分词查询。

例如,如果你有一个文档,其中包含"Elasticsearch is a great search engine",当你搜索"Elasticsearch"时,它会返回包含这个完整词汇的文档。

GET /_search
{
  "query": {
    "match_phrase": {
      "content": "Elasticsearch"
    }
  }
}

在这个例子中,只有包含"Elasticsearch"这个短语的文档会被搜索出来。

另外,如果你不希望Elasticsearch对你的查询进行分析,你可以使用keyword字段进行不分词查询。例如,如果你有一个字段name,它有一个子字段keyword,你可以使用这个字段进行不分词查询。

GET /_search
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "Elasticsearch"
      }
    }
  }
}

在这个例子中,只有name.keyword字段完全等于"Elasticsearch"的文档会被搜索出来。

 

 3. es客户端使用工具

找可视化工具,发现支持8.x 的很难找到,这里推荐一个简单好用的ElasticSearch可视化客户端,支持连接6,7,8版本的ES,不妨一试 

ElasticView 是一款用来监控ElasticSearch状态和操作ElasticSearch索引的web可视化工具。它由golang开发而成,具有部署方便,占用内存小等优点,官网地址:http://www.elastic-view.cn

  • ElasticSearch连接树管理(更方便的切换测试/生产环境)
  • 支持权限管理
  • 支持sql转换成dsl语法
  • 更方便的重建索引
  • 任务管理
  • 备份管理
  • 可将查询内容下载为excel文件
  • 可进行索引创建,映射创建,别名创建,索引删除等操作
  • 支持版本 6.x,7.x,8.x
  • 支持类似Navicat功能
  • docker部署
  • 支持sqlite3(免安装gcc版)
  • 数据抽取功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/740038.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7.7-DPday1

动态规划理论基础什么是动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的 在关于贪心…

gitlab私有仓库搭建

安全:关闭防火墙,selinux 1.安装GItlab所需的依赖包 yum install curl policycoreutils-python openssh-server postfix wget -y安装gitlab 获取gitlab源码包 选择各种yum源去安装 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.3-ce.0.el7.x86_64…

[LeetCode] 134. Gas Station

想到了提前判断和小于0的情况,懒得写,果然被阴间用例10万个加油站坑了。 class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:#1n = len(gas)if n ==1:if gas[0] >= cost[0]:return 0else:return -1#-1startpoint =[gas[x] - cost[…

算法金 | 推导式、生成器、向量化、map、filter、reduce、itertools,再见 for 循环

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」不要轻易使用 For 循环 For 循环,老铁们在编程中经常用到的一个基本结构,特别是在处理列表、字典这类数据结构时。但是,这东西真的是个双刃剑。虽然看起来挺直白,一…

(三)变分自动编码器

过去虽然没有细看,但印象里一直觉得变分自编码器(Variational Auto-Encoder,VAE)是个好东西。于是趁着最近看概率图模型的三分钟热度,我决定也争取把VAE搞懂。于是乎照样翻了网上很多资料,无一例外发现都很含糊,主要的感觉是公式写了一大通,还是迷迷糊糊的,最后好不容…

大气热力学(8)——热力学图的应用之一

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 目录8.1 复习斜 T-lnP 图上的几种线8.1.1 等温线和等压线8.1.2 干绝热线8.1.3 湿绝热线8.1.4 等…

(二)变分贝叶斯

变分 对于普通的函数f(x),我们可以认为f是一个关于x的一个实数算子,其作用是将实数x映射到实数f(x)。那么类比这种模式,假设存在函数算子F,它是关于f(x)的函数算子,可以将f(x)映射成实数F(f(x)) 。对于f(x)我们是通过改变x来求出f(x)的极值,而在变分中这个x会被替换成一个…

03-码出高效:Java开发手册.pdf

03-码出高效:Java开发手册.pdf 03-码出高效:Java开发手册.pdf ​​ ​​ ‍ ​​ ‍ ‍

Franka Emika Datasheet(技术参数)

任何人均可随时随地实现自动化。 Franka Emika 是德国慕尼黑的一家深科技公司,该公司致力于创造全新的机器人平台技术,提高性能,改善每个人的访问便捷 性,从而克服现代社会面临的最大难题之一,让整整一代人摆脱枯燥乏味、存在潜在危险且极其耗时的劳动和工作。为了实现高 …

Ubuntu 22.04搭建MC原版服务端

首先下载 JAVA 版服务器 https://www.minecraft.net/zh-hans/download/server服务器下载java 21。这里我看了需求,如果你开mc服务器从1.20.5(24w14a)开始,运行Minecraft的最低要求是Java 21,且操作系统要求为64位。 apt install openjdk-21-jdk 运行就行。java -Xmx1G -Xm…

小学期第一周(7.1-7.7)

7.1 周一 为啥被人学校都放假了我们还有小学期【微笑] 开玩笑其实我高兴得很,毕竟我是如此热爱学习 今天小学期一人分了四道题我把每道题都看了看答案最后选了四道代码比较少的,这样验收的时候还简单点 什么?问我为什么从网上 找答案不自己写?那我也得会写才行啊,我的基础…

大气热力学(7)——湿度参数

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记,现转化为电子版本以作存档。相较于手写笔记,电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 目录7.1 大气湿度的概念7.2 水汽压7.2.1 水汽压7.2.2 饱和水汽压7.2.3 饱和差7.3 混合比与比湿7…