【发布时间】:2021-07-27 20:47:00
【问题描述】:
我们使用弹性 7.13 我们正在使用 upsert 定期更新索引
操作顺序
-
使用动态映射创建新索引
all strings mapped as text"dynamic_templates": [ { "strings_as_keywords": { "match_mapping_type": "string", "mapping": { "type": "text", "analyzer": "autocomplete", "search_analyzer": "search_term_analyzer", "copy_to": "_all", "fields": { "keyword": { "type": "keyword", "normalizer": "lowercase_normalizer" } } } } }]
-
使用附加代码批量插入(我没有与其余代码等效的)
-
搜索特定字段
localhost:9200/mdsearch-vitaly123/_search { "query": { "match": { "fullyQualifiedName": `value_test` } } } -
得到 1 个结果
-
现在再次插入 "fullyQualifiedName": "value_test1234"(如第 2 步)
-
按照步骤 3 进行搜索
-
得到 2 个结果 1 个带有“fullyQualifiedName”的文档:“value_test” 和其他“fullyQualifiedName”:“value_test1234”
sn-p 下面的 upsert(第 2 步):
@Override
public List<BulkItemStatus> updateDocumentBulk(String indexName, List<JsonObject> indexDocuments) throws MDSearchIndexerException {
BulkRequest request = new BulkRequest().setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
ofNullable(indexDocuments).orElseThrow(NullPointerException::new)
.forEach(x -> {
var id = x.get("_id").getAsString();
x.remove("_id");
request.add(new UpdateRequest(indexName, id)
.docAsUpsert(true)
.doc(x.toString(), XContentType.JSON)
.retryOnConflict(3)
);
});
BulkResponse bulk = elasticsearchRestClient.bulk(request, RequestOptions.DEFAULT);
return stream(bulk.getItems())
.map(r -> new BulkItemStatus(r.getId(), isSuccess(r), r.getFailureMessage()))
.collect(Collectors.toList());
}
我可以按更新的属性进行搜索。
但问题是搜索会检索“更新的字段”和以前的字段。
我该如何解决? 可能会以某种方式将版本号限制为只有 1。
我设置了setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE),但没有帮助
在图片中我们可以看到结果
P.S - 也检索到旧数据和更新数据
建议?
问候,
【问题讨论】:
-
当您更新一个文档时,版本总是会增加,当您检索文档时您检索的是实际文档的内容,之前的文档将永远消失。所以我不确定你所说的“旧数据”是什么意思。 ES 不保留给定文档的多个版本,只保留最后一个版本。也许向我们展示一个序列(获取、更新、获取)以及您认为不正确的地方?
-
@Val - 我已经更新了我的问题
-
你能打开你得到的两个点击吗?它们必须有不同的 ID,这意味着您没有进行任何更新,而只是使用新 ID 插入
标签: java elasticsearch