java - 在使用 Java 高级别的客户端批量 API 创建动态弹性搜索索引时需要帮助
问题描述
我正在创建一个将与我们的 Java 代码库集成的 Elasticsearch 集群。我想创建一个 Elasticsearch 索引并将来自多个数据库的 SQL Query 数据插入其中。所有数据库的查询结果都应该插入到同一个索引中。为此,我正在使用 Java High level Rest Client。但我不太确定如何执行此操作,因为旧 API 中的许多方法已被弃用。我也不太确定如何处理 createIndexResponse 实例。任何人都可以帮助我吗?
public static void method_1(Connection con) throws Exception {
Statement statement = con.createStatement();
try {
ResultSet result = statement.executeQuery("SELECT Field_1, Field_2, Field_3 from Table_1");
int counter = 1;
CreateIndexRequest createIndexRequest = new CreateIndexRequest("index_name");
createIndexRequest.settings(new Settings.Builder()
.put("cluster.name", "my_cluster")
.put("http.enabled", true)
.put("node.data", true)
.put("index.number_of_shards", 3)
.put("index.number_of_replicas", 1)
.build());
CreateIndexResponse createIndexResponse = ElasticSearch.eclient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
BulkRequest bulkRequest = new BulkRequest();
while (result.next()) {
String field_1 = result.getString("Field_1");
int field_2 = result.getInt("Field_2");
String field_3 = result.getString("Field_3");
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("Field 1", field_1)
.field("Field 2", field_2)
.field("Field 3", field_3)
.endObject();
UpdateRequest updateRequest = new UpdateRequest("index_name", "_doc", Integer.toString(counter));
updateRequest.doc(builder);
bulkRequest.add(updateRequest);
}
BulkResponse response = ElasticSearch.eclient.bulk(bulkRequest, RequestOptions.DEFAULT);
if (response.hasFailures()) {
for (BulkItemResponse item : response.getItems()) {
System.out.println(item.getFailureMessage());
}
}
counter++;
statement.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
解决方案
您没有提供您使用的版本。无论如何,我正在考虑您使用的是 7.0.0。
这是一个我猜应该没问题的例子:
try (RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(HttpHost.create("http://localhost:9200")))) {
CreateIndexRequest createIndexRequest = new CreateIndexRequest("index_name");
createIndexRequest.settings(Settings.builder()
.put("index.number_of_shards", 3)
.put("index.number_of_replicas", 1)
.build());
client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
BulkRequest bulkRequest = new BulkRequest();
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("foo", "bar")
.endObject();
IndexRequest indexRequest = new IndexRequest("index_name");
indexRequest.source(builder);
bulkRequest.add(indexRequest);
BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
if (response.hasFailures()) {
for (BulkItemResponse item : response.getItems()) {
System.out.println(item.getFailureMessage());
}
}
} catch (IOException e) {
e.printStackTrace();
}
我建议使用BulkProcessor
更容易处理 IMO 的类。我有一个完整的演示存储库,我会在每个新版本中更新它。它也可能对您有所帮助。
推荐阅读
- frameworks - 如何找到库/框架的函数参数或类属性的可能值?
- javascript - 隐藏提交按钮,直到通过纯 JavaScript 选择文件
- php - 如何在 Mac OS X 下修复 PhpStorm 中的“PHP cgi 错误”?
- django - Django继承避免创建许多html文件
- reactjs - expo-face-detector:在检测到的面部上渲染时出现黑屏
- hive - 如何使用 unix_timestamp 和 from_unixtime Hive 函数将数据类型更改为时间戳
- powerbi - 仅使用 Power Query 而不是 DAX 将 1 到 12(数字类型)转换为 1 月到 12 月
- ruby - 红宝石替换样品?
- assembly - AVX2 _mm256_shuffle_epi8 在尝试左移 2 个字节时在字符串中间留下一个间隙
- javascript - 一个项目中有 2 个 React