Java RestHighLevelClient中UpdateByQueryRequest的setQuery使用问题
问题原因
你无法调用UpdateByQueryRequest.setQuery()方法一般是两种情况导致的:
- 你使用的ES Java客户端版本低于6.3,该版本之前
UpdateByQueryRequest没有直接暴露setQuery()方法,查询参数需要通过内部的SearchSourceBuilder设置 - 你使用了带
SearchRequest参数的构造方法,该场景下查询条件需要定义在传入的SearchRequest对象中,无需在UpdateByQueryRequest上单独设置查询
正确实现语法
场景1:使用无参构造方法
如果你的客户端版本 >= 6.3,可直接调用setQuery方法:
import org.elasticsearch.index.reindex.UpdateByQueryRequest; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import java.util.Collections; // 构造请求,指定目标索引 UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest("你的索引名"); // 直接设置查询条件 updateByQueryRequest.setQuery(QueryBuilders.termQuery("匹配字段", "匹配值")); // 设置更新脚本 updateByQueryRequest.setScript(new Script( ScriptType.INLINE, "painless", "ctx._source.待更新字段 = '新值'", Collections.emptyMap() ));
如果你的客户端版本低于6.3,通过source()方法获取内部搜索源对象再设置查询:
UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest("你的索引名"); // 低版本通过source()获取SearchSourceBuilder后设置查询 updateByQueryRequest.source().setQuery(QueryBuilders.termQuery("匹配字段", "匹配值")); updateByQueryRequest.setScript(new Script( ScriptType.INLINE, "painless", "ctx._source.待更新字段 = '新值'", Collections.emptyMap() ));
场景2:使用带SearchRequest参数的构造方法
将查询条件直接设置到传入的SearchRequest对象中即可:
import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.index.reindex.UpdateByQueryRequest; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.script.Script; import org.elasticsearch.script.ScriptType; import java.util.Collections; SearchRequest searchRequest = new SearchRequest("你的索引名"); // 给SearchRequest设置查询条件 searchRequest.source().setQuery(QueryBuilders.termQuery("匹配字段", "匹配值")); // 传入构造方法生成UpdateByQueryRequest UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest(searchRequest); // 设置更新脚本 updateByQueryRequest.setScript(new Script( ScriptType.INLINE, "painless", "ctx._source.待更新字段 = '新值'", Collections.emptyMap() ));
注意事项
- 请保持ES Java客户端版本与服务端版本完全一致,避免出现API不兼容、请求报错的问题
- ES 7.x及以上版本已经废弃了类型(type)相关API,创建
SearchRequest时无需调用types()方法
内容的提问来源于stack exchange,提问作者rock321987
相关产品推荐
相关产品推荐

