Java里 es 多条件查询并更新多个字段的公用方法
时间: 2024-03-17 13:41:30 浏览: 124
可以使用 Elasticsearch 提供的 Update By Query API 来实现多条件查询并更新多个字段的操作。以下是一个 Java 实现的示例代码:
```java
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.UpdateByQueryRequest;
import org.elasticsearch.index.reindex.UpdateByQueryResponse;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import java.io.IOException;
import java.util.Map;
public class MultiFieldUpdateUtil {
public static BulkResponse multiFieldUpdate(RestHighLevelClient client, String index, Map<String, Object> queryMap, Map<String, Object> updateMap) throws IOException {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
for (Map.Entry<String, Object> entry : queryMap.entrySet()) {
boolQuery.must(QueryBuilders.termQuery(entry.getKey(), entry.getValue()));
}
Script script = new Script(ScriptType.INLINE, "painless", generateScript(updateMap), null);
UpdateByQueryRequest request = new UpdateByQueryRequest(index);
request.setQuery(boolQuery);
request.setScript(script);
UpdateByQueryResponse updateByQueryResponse = client.updateByQuery(request, RequestOptions.DEFAULT);
return updateByQueryResponse.getBulkResponse();
}
private static String generateScript(Map<String, Object> updateMap) {
StringBuilder scriptBuilder = new StringBuilder();
scriptBuilder.append("ctx._source.putAll([");
for (Map.Entry<String, Object> entry : updateMap.entrySet()) {
scriptBuilder.append("\"").append(entry.getKey()).append("\": ");
Object value = entry.getValue();
if (value instanceof String) {
scriptBuilder.append("\"").append(value).append("\", ");
} else {
scriptBuilder.append(value).append(", ");
}
}
scriptBuilder.append("])");
return scriptBuilder.toString();
}
}
```
该工具类中的 multiFieldUpdate 方法接收三个参数,分别是 Elasticsearch 客户端实例、索引名、查询条件和更新内容。其中,查询条件和更新内容都是以 Map 的形式传入的,可以自由指定多个字段和对应的值。方法中使用了 Elasticsearch 提供的 Update By Query API 来实现多条件查询并更新多个字段的操作。
需要注意的是,由于 Elasticsearch 的版本差异较大,具体的 API 调用方式可能会有所不同,上述代码适用于 Elasticsearch 7.x 版本。同时,该工具类没有进行任何异常处理,需要根据具体情况进行修改。
阅读全文