【发布时间】:2020-01-14 03:42:40
【问题描述】:
我正在编写一个控制台应用程序,以将 json 文件中的数据插入 Elastic search 7.5.1。 _id 字段应该是一个 int 并且表现得像自动增量。为了做到这一点,在插入之前,我会插入最后一个 ID 并增加 1。
我的问题是我无法获取最后一个 ID,因为排序是在字符串上进行的。这就是我的意思:如果你有10 items并且最后一个ID是10,那么在查询和排序时它将返回9。
这是我在使用 PostMan 时的查询:
GET my_index/_search
{
"size": 1,
"query": {
"match_all": {}
},
"sort": [{
"_id": {
"order": "desc"
}
}
]
}
我的 Java 函数使用 their client:
private static String getLastElasticSearchId(String index)
{
RestHighLevelClient client = getElasticSearchClient();
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder b = new SearchSourceBuilder();
b.query(QueryBuilders.matchAllQuery());
b.sort(new FieldSortBuilder("_id").order(SortOrder.DESC));
b.from(0);
b.size(1);
searchRequest.source(b);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = searchResponse.getHits();
if(hits.getTotalHits().value > 0){
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
return hit.getId();
}
}
else {
return "0";
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
两者都返回 9 作为最后一个 ID,即使索引中有另一个项目的 ID 为 10。
我无法在回答 here 的 ID 中应用字符串填充。
关于如何实现我需要的任何帮助?
感谢您的帮助。
【问题讨论】:
-
如果所有事情都发生在同一个进程中,我会使用 AtomicInteger 来跟上分配的最后一个 ID。如果您尝试从已创建的记录中获取最后一个 ID,这也将解决可能出现的竞争条件。
标签: java elasticsearch