Easysearch Java SDK 2.0.x 使用指南(二)

news/2024/12/23 23:25:09/文章来源:https://www.cnblogs.com/infinilabs/p/18625279

在 上一篇文章 中,我们介绍了 Easysearch Java SDK 2.0.x 的基本使用和批量操作。本文将深入探讨索引管理相关的功能,包括索引的创建、删除、开关、刷新、滚动等操作,以及新版 SDK 提供的同步和异步两种调用方式。

SDK 的对象构建有两种方式

1. 传统的 Builder 方式

最基础的方式,像这样:

CreateIndexResponse createResponse = client.indices().create(new CreateIndexRequest.Builder().index("my-index").aliases("foo",new Alias.Builder().isWriteIndex(true).build()).build()
);

优点简单直观,但稍显笨重。

2. Lambda 表达式方式

这才是推荐的写法,简洁优雅:

CreateIndexResponse createResponse = client.indices().create(c -> c.index("my-index").aliases("foo", a -> a.isWriteIndex(true)));

Lambda 方式不仅代码少,最大的优点是不用记那么多 Builder 类名。尤其是写复杂查询的时候,代码层次感特别强:

// 命名建议:用 b0、b1 这样的简写表示嵌套层级
SearchResponse<Doc> results = client.search(b0 -> b0.index("my-index").query(b1 -> b1.bool(b2 -> b2.must(b3 -> b3.match(b4 -> b4.field("title").query("搜索"))).filter(b3 -> b3.range(b4 -> b4.field("date").gte("2024-01-01"))))),Doc.class
);

好了,说回索引管理

啥是索引管理?

简单来说就是对索引进行增删改查的一些基本操作。比如:

  • 建个新索引
  • 删掉不要的索引
  • 关闭/打开某个索引
  • 刷新一下让数据立马能搜到
  • 清个缓存
  • 整理一下索引段(让搜索更快)

新版 SDK 在这块的设计特别贴心,同步异步都支持,用起来特别顺手。

同步方式怎么用?

上代码!下面这段代码基本涵盖了日常用到的所有索引管理操作:

    String index = "test1";// 先看看索引在不在if (client.indices().exists(r -> r.index(index)).value()) {LOGGER.info("Deleting index " + index);// 在的话就删掉重来DeleteIndexResponse deleteIndexResponse =client.indices().delete(new DeleteIndexRequest.Builder().index(index).build());LOGGER.info(deleteIndexResponse.toString());}// 建个新的LOGGER.info("Creating index " + index);CreateIndexResponse createIndexResponse =client.indices().create(req -> req.index(index));// 关闭索引CloseIndexResponse closeIndexResponse =client.indices().close(req -> req.index(index));// 打开索引OpenResponse openResponse =client.indices().open(req -> req.index(index));// 刷新一下,让刚写入的数据马上能搜到RefreshResponse refreshResponse =client.indices().refresh(req -> req.index(index));// 把内存里的数据都写到磁盘上FlushResponse flushResponse =client.indices().flush(req -> req.index(index));// 整理一下索引段,搜索会快很多// maxNumSegments(1L) 意思是整理成一个段ForcemergeResponse forcemergeResponse =client.indices().forcemerge(req -> req.index(index).maxNumSegments(1L));

看代码就能明白,这些操作都特别直观,基本上方法名就能告诉你它是干啥的。而且返回的 Response 对象里都带着详细的执行结果,出了问题很容易排查。

异步方式又是咋回事?

有时候你可能不想等着这些操作一个个完成,这时候就可以用异步方式:

String index = "test1";EasysearchAsyncClient asyncClient = SampleClient.createAsyncClient();// 用CompletableFuture串起来一串操作asyncClient.indices().exists(req -> req.index(index)).thenCompose(exists -> {if (exists.value()) {LOGGER.info("Deleting index " + index);return asyncClient.indices().delete(r -> r.index(index)).thenAccept(deleteResponse -> {LOGGER.info(deleteResponse);});}return CompletableFuture.completedFuture(null);}).thenCompose(v -> {LOGGER.info("Creating index " + index);return asyncClient.indices().create(req -> req.index(index));}).whenComplete((createResponse, throwable) -> {if (throwable != null) {LOGGER.error("哎呀出错了", throwable);} else {LOGGER.info("搞定!");}}).get(30, TimeUnit.SECONDS); // 最多等30秒

异步方式看起来代码多了点,但是好处也很明显:

  1. 不会卡住主线程
  2. 可以并发执行多个操作
  3. 配合 CompletableFuture 能实现很多花样

小贴士

  1. 选哪种方式?

    • 简单场景用同步,代码简单直观
    • 要并发或者不想阻塞就用异步
  2. 记得处理异常

    • 同步的就直接 try-catch
    • 异步的用 whenComplete 或 exceptionally 来处理
  3. 性能方面

    • force merge 挺耗资源的,建议半夜执行
    • refresh 太频繁会影响写入性能,根据需要权衡

自动翻转 (Rollover)

在管理 Easysearch 索引时,我们经常需要控制单个索引的大小和时间跨度。Easysearch 的 Rollover API 提供了一个优雅的解决方案,允许我们基于特定条件自动创建新索引。本文将介绍如何使用 Java API 实现索引 rollover。

什么是 Rollover?

Rollover 是一种索引管理机制,当现有索引满足一个或多个条件时(如达到一定大小、文档数量或时间),会自动创建一个新索引。这对于日志管理等场景特别有用。

实现示例

首先,我们需要创建一个初始索引并设置别名:

String index = "test-00001";
// 如果索引存在则删除
if (client.indices().exists(r -> r.index(index)).value()) {client.indices().delete(new DeleteIndexRequest.Builder().index(index).build());
}// 创建索引并设置别名
client.indices().create(req -> req.index(index).aliases("test_log", a -> a.isWriteIndex(true)));

配置 Rollover 条件

有两种方式配置 rollover 条件:

方式一:使用 Java API

RolloverResponse res = client.indices().rollover(req -> req.alias("test_log").conditions(c -> c.maxDocs(100L)        // 文档数量超过100.maxAge(b -> b.time("7d"))  // 索引年龄超过7天.maxSize("5gb")));    // 索引大小超过5GB

方式二:使用 JSON 配置

String conditionsJson = """
{"conditions": {"max_docs": 100,"max_age": "7d","max_size": "5gb"}
}
""";RolloverResponse response = client.indices().rollover(req -> req.alias("test_log").withJson(new StringReader(conditionsJson))
);

Rollover 条件说明

  • max_docs: 索引中的最大文档数
  • max_age: 索引最大存在时间
  • max_size: 索引的最大存储大小

当满足任一条件时,系统会自动创建新索引。新索引的命名规则是将原索引名称中的数字部分加 1。


想要了解更多?

  • 客户端 Maven 地址: https://mvnrepository.com/artifact/com.infinilabs/easysearch-client/2.0.2
  • 更详细的文档和示例代码在 官网 持续更新中,请随时关注!

大家有啥问题或者建议,也欢迎随时反馈!

关于 Easysearch

INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。

官网文档:https://infinilabs.cn/docs/latest/easysearch

作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。

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

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

相关文章

《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结

《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结@目录二、高级篇(大厂进阶)2.DockerFile解析2.1 是什么2.2 DockerFile构建过程解析2.3 DockerFile常用保留字指令2.4案例2.4.1自定义镜像mycento…

按钮修改状态

首先创造函数void updateBaoxiaoSchedule( int id, String schedule, String schedulereason); 及其实现。 SQL语句: @Update("update submit set state=#{state},statereason=#{statereason} where id=#{id} ") void updateSubmit1( @Param("id") int id…

泰山派设备控制(RGB)

泰山派设备系统控制(RGB) 1、进入设备系统 cd /sys/class2、进入RGB灯子系统 cd /sys/class/leds/罗列可操作的设备,可以看到三个设备,“rgb-led-b”,“rgb-led-g”,“rgb-led-r”,分别对应RGB的蓝,绿,红。3、我们对其单一色灯进行操作 cd rgb-led-b4、ls罗列出可操作的…

《计算机组成及汇编语言原理》阅读笔记:p48-p81

《计算机组成及汇编语言原理》学习第 4 天,p48-p81 总结,总计 34 页。 一、技术总结 1.CISC vs RISC p49, complex instruction set computing For example, a complex instruction set computing (CISC) chip may be able to move a large block of data, perhaps a strin…

在VS2022中,“根据模型生成数据库”时报错:已添加了具有相同键的项(或:An item with the same key has already been added)

解决方法:关闭解决方案,打开解决方案所在文件夹,打开以下文件夹:.vs\ConsoleApp7\FileContentIndex,然后删除里面的所有文件,再重新在VS中打开解决方案重新生成即可

超级AI图像放大工具Upscayl:让你的照片细节更清晰,色彩更鲜艳!

前言 Hello大家好,我又来推荐非常好用的AI图片无损放大器,模糊图片秒变高清,Upscayl是一个免费开源的AI图像超分辨率工具。它使用AI模型来通过猜测细节的方式增强图像并提高其分辨率。该工具适用于Linux、macOS和Windows操作系统 安装环境 [名称]:Upscayl [大小]:400.99MB …

全民点评 测试用例Xmind

项目简介:该项目是一款基于用户点评和校园商户信息为主的生活服务平台。项目利用 Redis 的特性解决不同业务场景中的问题,核心工作包括设计实现缓存更新策略,解决缓存相关问题、订单超卖的线程安全问题。 技术架构:SpringBoot + Mybatis - Plus + MySQL + Redis 功能测试:…

NginxUI:界面化管理Nginx的工具

一、NginxUI简介 1.1 NginxUI介绍 Nginx UI 是一个全新的 Nginx 网络管理界面,旨在简化 Nginx 服务器的管理和配置。它提供实时服务器统计数据、ChatGPT 助手、一键部署、Lets Encrypt 证书的自动续签以及用户友好的网站配置编辑工具。 此外,Nginx UI 还提供了在线访问 Nginx…

Codeforces 1842I. Tenzing and Necklace

神仙题。本题解参考官方题解进行编写,并补充了最后比较关键的怎么调整 \(m\)。 题目链接:I - Tenzing and Necklace 题目大意:给定一个环,环上有 \(n\) 个点与 \(n\) 条边,第 \(i\) 条边连接 \(i\) 与 \(i\bmod n +1\),边权为 \(a_i\)。要求断开若干边使得环断为若干段,…

Docker-compose 实战

以下是一个使用 Docker-compose 启动 Flask 应用的示例: 项目结构:app/|-- app.py|-- requirements.txt|-- Dockerfile|-- docker-compose.ymlapp.py 文件内容: from flask import Flaskapp = Flask(__name__)@app.route(/) def hello_world():return Hello from Flask in D…

Doc for DevNow

DevNow 官方文档,介绍 DevNow 的使用方法及一些扩展内容,方便大家使用前言 DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 🎉🎉 首先庆祝下 DevNow star 在不久前过百,对我来说还是蛮有成就感的,感谢大家的支…

巧用mask属性创建一个纯CSS图标库

说明mask 是CSS中的一个属性,它允许开发者在元素上设置图像作为遮罩层。这个属性的强大之处,在于它可以接受多种类型的值,包括关键字值、图像值、渐变色,甚至可以设置多个属性值。 SVG(Scalable Vector Graphics,可缩放矢量图形)是一种基于 XML 的图像格式,用于定义二维…