我试图在弹性搜索索引中对文档进行索引更新。
在白天定期运行作业,以识别自上次作业运行以来已更新的数据库记录。我希望能够更新索引中的这些特定记录。记录中的任何字段都可能已更改。
所以我填充一个数据集,然后遍历记录,用数据库中的所有属性填充我的类的实例。
每次我想更新索引中的相应记录,或者如果它当前不存在则添加它......
在我的循环中我尝试使用这样的代码来进行更新......
client.Update<MyContentClass>(u => u
.Id("AU-7zORce3_kxnyDoVLv")
.Index("qubecontent")
//.Doc(new MyContentClass { ESUniqueKey = MyContentClassInstance.ESUniqueKey })
.DocAsUpsert()
.Refresh()
);
我不确定Id正在引用什么?这是弹性搜索为每个索引记录自动生成的id吗?我确实在我的班级中生成了一个额外的唯一ID,但不确定我是如何引用它的?
有人可以建议我如何为更改的记录执行此索引更新吗?
答案 0 :(得分: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语句。
注意:如果要重新生成整个文档,那么您真正要做的是覆盖旧文件和旧文件。然后您可以使用相同的ID再次POST,它将使用新记录覆盖旧记录。覆盖将比