📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入
Easysearch Java SDK 2.0.x 使用指南(二)

上一篇文章 中,我们介绍了 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。


想要了解更多?

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

标签
Easysearch x
产品更新 x
performance x
2026 x
开源 x
赞助 x
开源生态 x
社区 x
Coco AI x
二等奖 x
兴智杯 x
人工智能 x
赛事 x
低空经济 x
商业化 x
数据分析 x
金猿奖 x
国产化 x
搜索引擎 x
技术卓越奖 x
创新产品奖 x
IT168 x
APM x
Skywalking x
Easy-Es x
Coco x
AI x
GitLab x
代码审核 x
石油石化 x
Gitee x
投票 x
Meilisearch x
Rust x
轻量级 x
搜索百科 x
Docker x
Docker Compose x
Easyserach x
Console x
DevOps x
Elasticsearch x
国产替代 x
backup x
snapshot x
CCR x
Gateway x
esdump x
source_reuse x
ignore_above x
OpenSearch x
AWS x
Lucene x
Solr x
Easyearch x
发明专利 x
数据分区 x
国际专利 x
一等奖 x
人工智能应用创新大赛 x
bulk x
embedding x
OpenAI x
IK x
TDBC x
2025 x
信通院 x
可信数据库大会 x
搜索型数据库 x
中国数据库产业图谱 x
上海开源创新菁英荟 x
开源创新新星企业 x
Workshop x
AI 搜索 x
智能助手 x
Automation x
Logstash x
MongoDB x
开源中国 x
直播 x
merge x
Elasticsearch 9 x
GitCode x
AI搜索 x
Cloud x
rollup x
Kubernetes x
Operator x
Arm64 x
Snapshot x
S3 x
Grafana x
Opensearch x
Nginx x
直播活动 x
搜索客社区 x
Meetup x
ES x
企业搜索 x
DeepSeek x
RAG x
certificate x
windows x
Rollup x
TopN x
Filebeat x
Ubuntu x
请求限速 x
INFINI Console x
指标 x
Kibana x
多集群 x
client x
Spring Boot x
ECE x
ES Bulk x
vector database x
Postgres x
可搜索快照 x
SDK x
官网 x
Web 开发 x
Next.js x
React x
Three.js x
Metrics x
Helm x
filter x
querycache x
practice x
Agent x
localStorage x
响应式 x
时间组件 x
时区组件 x
极限科技 x
三周年 x
周年庆 x
国家高新技术企业 x
校园招聘 x
湖北工业大学 x
Tauri x
Web 开发人员 x
桌面应用开发 x
桌面端 x
Electron x
Pizza x
认证培训 x
报名 x
Scrapy x
爬虫 x
Rust开发者大会 x
docsearch x
文档搜索 x
Easyseach x
有奖征文 x
黑神话悟空 x
EKS x
征文系列 x
跨集群搜索 x
科技中小企业 x
白皮书 x
Python SDK x
数据库产业图谱 x
超大规模 x
分布式集群 x
写入限流 x
2024可信数据库发展大会 x
创新型中小企业 x
搜索数据库 x
正排索引 x
免费许可证 x
K8S x
DTC2024 x
实时搜索 x
ES国产化 x
Redis x
OOM x
测试 x
内存 x
趋势 x
AI绘画 x
Stable Diffusion x
Diffusion x
Model x
GAN x
语义搜索 x
知识图 x
向量数据库 x
中国信通院 x
星河(Galaxy) x
标杆案例 x
鲲鹏 x
鲲鹏技术认证 x
客户端 x
日志平台 x
LDAP x
Loadgen x
中国一汽 x
国内数据库 x
墨天轮 x
监控系统 x
集成测试 x
ZSTD x
Helm Charts x
国产适配 x
兆芯 x
Linux x
LoongArch x
信创适配 x
二维拆分算法 x
中国移动云 x
Vault x
加密 x
安全工具 x
kNN x
向量检索 x
图片搜索 x
Alerting x
SQL x
搜索 x
Embedding x
可信数据库 x
统信 x
海光 x
龙芯 x
restore x
Arm x
大数据企业证书 x
移动云大会 x
信通院产品评测 x
国内首家 x
数据可视化 x
北京软协 x
第十届理事会会员单位 x
Apache Arrow x
宣传片 x
大会分享 x
多集群管理 x
无缝数据迁移 x
Loadrun x
INFINI Gateway x
log4j x