如何用OpenSearch Java Client实现带Query与Script的UpdateByQuery
使用OpenSearch Java Client实现UpdateByQuery操作(含Script构建)
以下是完全匹配你提供的DSL的OpenSearch Java Client实现代码,重点说明Script.Builder的构建方式:
完整代码示例
import org.opensearch.client.opensearch.OpenSearchClient; import org.opensearch.client.opensearch.core.UpdateByQueryRequest; import org.opensearch.client.opensearch.core.UpdateByQueryResponse; import org.opensearch.client.opensearch._types.query_dsl.Query; import org.opensearch.client.opensearch._types.query_dsl.TermsQuery; import org.opensearch.client.opensearch._types.Script; import org.opensearch.client.opensearch._types.ScriptLanguage; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class UpdateByQueryDemo { public static void main(String[] args) throws IOException { // 替换为你的OpenSearchClient实例 OpenSearchClient client = initOpenSearchClient(); // 构建匹配_id=123的terms查询 Query idQuery = TermsQuery.of(t -> t .field("_id") .terms(terms -> terms.value(v -> v.stringValue("123"))) )._toQuery(); // 定义脚本参数 Map<String, Object> scriptParams = new HashMap<>(); scriptParams.put("time", 2); scriptParams.put("acctId", "999"); scriptParams.put("hash", "rqwtqw"); // 构建Painless脚本 Script updateScript = Script.of(s -> s .lang(ScriptLanguage.Painless) .source("if (ctx._source.time < params.time) { ctx._source.time = 8; }") .params(scriptParams) ); // 组装UpdateByQuery请求 UpdateByQueryRequest request = UpdateByQueryRequest.of(req -> req .index("demo_index") .query(idQuery) .script(updateScript) ); // 执行请求并处理响应 UpdateByQueryResponse response = client.updateByQuery(request); System.out.printf("匹配文档数:%d,成功更新数:%d%n", response.total(), response.updated()); } // 初始化OpenSearchClient,根据你的集群配置调整 private static OpenSearchClient initOpenSearchClient() { // 示例初始化逻辑,实际场景替换为你的配置 // RestClient restClient = RestClient.builder(new HttpHost("your-host", 9200, "http")).build(); // OpenSearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper()); // return new OpenSearchClient(transport); return null; } }
关键细节说明
1. Script.Builder核心构建逻辑
OpenSearch Java Client通过Script.of()静态方法创建脚本实例,对应你DSL中的script字段:
lang(ScriptLanguage.Painless):指定脚本语言为Painless,和DSL的lang: "painless"完全对应。source():传入Painless脚本内容,注意原DSL中的cox是笔误,正确上下文变量为ctx(OpenSearch脚本上下文对象),代码已修正。params(scriptParams):传入参数Map,键值对完全匹配DSL中的params节点。
2. 查询部分构建
使用TermsQuery.of()构建_id的terms查询,通过_toQuery()转换为通用Query类型后传入请求。
3. 依赖说明
确保引入对应版本的OpenSearch Java Client依赖(以Maven为例):
<dependency> <groupId>org.opensearch.client</groupId> <artifactId>opensearch-java</artifactId> <version>2.11.0</version> <!-- 使用与你的集群匹配的版本 --> </dependency>
内容的提问来源于stack exchange,提问作者ninjacoder99
相关产品推荐
相关产品推荐

