如何避免向 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",
}