首页 文章

如何使用NEST更新ElasticSearch索引中的现有文档?

提问于
浏览
0

我试图在弹性搜索索引中对文档进行索引更新 .

作业在白天定期运行,用于标识自上次作业运行以来已更新的数据库记录 . 我希望能够更新索引中的这些特定记录 . 记录中的任何字段都可能已更改 .

所以我填充一个数据集,然后遍历记录,用数据库中的所有属性填充我的类的实例 .

每次我想更新索引中的相应记录或添加它,如果它当前不存在...

在我的循环中我尝试这样的代码来做更新...

client.Update<MyContentClass>(u => u
                .Id("AU-7zORce3_kxnyDoVLv")
                .Index("qubecontent")
                //.Doc(new MyContentClass { ESUniqueKey = MyContentClassInstance.ESUniqueKey })
                .DocAsUpsert()
                .Refresh()
                );

我不确定Id正在引用什么?这是弹性搜索为每个索引记录自动生成的id吗?我确实在我的 class 中生成了一个额外的唯一ID,但不确定我是如何引用它的?

任何人都可以建议我如何为更改的记录执行此索引更新?

1 回答

  • 0

    upsert中的ID字段确实引用了内部ElasticSearch ID(将其视为ES的主键) . 如果您已拥有自己唯一的主键,则可以将其用作ES中的主键 . 拿这些例子:

    示例1:让ES生成自己的ID

    POST test/type1
    {
      "f1": "record 1",
      "f2": "2000-01-01"
    }
    

    结果1:

    {
       "_index": "test",
       "_type": "type1",
       "_id": "AU--Dz-Kl6g2APRJ9y7l",
       "_version": 1,
       "created": true
    }
    

    您可以看到ES生成了自己的主键“AU - Dz-Kl6g2APRJ9y7l”

    示例2:指定您自己的ID

    POST test/type1/thisIsMyID
    {
      "f1": "record 1",
      "f2": "2000-01-01"
    }
    

    结果2:

    {
       "_index": "test",
       "_type": "type1",
       "_id": "thisIsMyID",
       "_version": 1,
       "created": true
    }
    

    请注意在示例2中它如何使用我指定的ID . 一旦使用与ES相同的主键,就可以运行upsert语句 .

    注意:如果要重新生成整个文档,并且您真正想要做的是覆盖旧的vs upsert旧的 . 然后您可以使用相同的ID再次POST,它将使用新记录覆盖旧记录 . 覆盖将比upserting更快 WAY .

相关问题