如何避免向 ElasticSearch 插入重复文档
How to avoid inserting a duplicate document to ElasticSearch
我正在使用 node.js/request 抓取大量项目并将字段映射到 ElasticSearch 文档。原始文件有一个永远不会改变的 ID 字段:
{ id: 123456 }
我想定期 "refresh" 看看哪些原始商品出于某种原因不再可用。目前,我有一个直接抓取并简单地插入 Elastic 的脚本。
有没有办法在插入之前检查是否已经存在具有相同 ID 的项目?我不想以大量重复结束。
当您使用批量 api 将数据推送到 elastic 时,您可以执行索引操作,并将源数据 ID 用作 _id,在这种情况下,elastic 将创建或替换文档(如果存在具有相同 ID 的文档), 这是批量操作的例子
function createBulkBody(items, indexName) {
var result = [];
_.forEach(items, function(item) {
result.push({
index: {
_index: indexName,
_type: item.type,
_id: item.ID
}
});
result.push(item);
});
return result;
}
然后批量推送数据api,
var body = createBulkBody(items, indexName);
esClient.bulk({
body: body
}, function(err, resp) {
if (err) {
console.log(err);
} else {
console.log(resp);
}
});
希望对您有所帮助
如果您想在尝试插入某个项目之前检查该项目是否存在,您只需在数据库中查询该文档即可。如果结果不为空,这意味着具有此 id
的文档已经存在。
您可以使用 term
查询:
q = {'term': {'id': '123456'}}
我想这会非常耗时,但这是一种确保不会插入重复项的方法。
假设您使用的是 Elasticsearch Javascript API,您可以执行一个简单的 get request on a known ID:
client.get({
index: 'myindex',
type: 'mytype',
id: 1
}, function (error, response) {
// ...
});
404 响应状态表示文档不存在:
您是否使用您的 ID 作为证件_id
?然后使用 operation type 应该很容易,您可以在其中指定只创建具有特定 ID 的文档,而不是覆盖它:
PUT your-index/your-type/123456/_create
{
"foo" : "bar",
}
我正在使用 node.js/request 抓取大量项目并将字段映射到 ElasticSearch 文档。原始文件有一个永远不会改变的 ID 字段:
{ id: 123456 }
我想定期 "refresh" 看看哪些原始商品出于某种原因不再可用。目前,我有一个直接抓取并简单地插入 Elastic 的脚本。
有没有办法在插入之前检查是否已经存在具有相同 ID 的项目?我不想以大量重复结束。
当您使用批量 api 将数据推送到 elastic 时,您可以执行索引操作,并将源数据 ID 用作 _id,在这种情况下,elastic 将创建或替换文档(如果存在具有相同 ID 的文档), 这是批量操作的例子
function createBulkBody(items, indexName) {
var result = [];
_.forEach(items, function(item) {
result.push({
index: {
_index: indexName,
_type: item.type,
_id: item.ID
}
});
result.push(item);
});
return result;
}
然后批量推送数据api,
var body = createBulkBody(items, indexName);
esClient.bulk({
body: body
}, function(err, resp) {
if (err) {
console.log(err);
} else {
console.log(resp);
}
});
希望对您有所帮助
如果您想在尝试插入某个项目之前检查该项目是否存在,您只需在数据库中查询该文档即可。如果结果不为空,这意味着具有此 id
的文档已经存在。
您可以使用 term
查询:
q = {'term': {'id': '123456'}}
我想这会非常耗时,但这是一种确保不会插入重复项的方法。
假设您使用的是 Elasticsearch Javascript API,您可以执行一个简单的 get request on a known ID:
client.get({
index: 'myindex',
type: 'mytype',
id: 1
}, function (error, response) {
// ...
});
404 响应状态表示文档不存在:
您是否使用您的 ID 作为证件_id
?然后使用 operation type 应该很容易,您可以在其中指定只创建具有特定 ID 的文档,而不是覆盖它:
PUT your-index/your-type/123456/_create
{
"foo" : "bar",
}