我的文档包含一个可在运行时编辑属性(添加/删除/编辑)的对象。
{
"testIndex" : {
"mappings" : {
"documentTest" : {
"properties" : {
"typeTestId" : {
"type" : "string",
"index" : "not_analyzed"
},
"createdDate" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"designation" : {
"type" : "string",
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed"
}
}
},
"id" : {
"type" : "string",
"index" : "not_analyzed"
},
"modifiedDate" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"stuff" : {
"type" : "string"
},
"suggest" : {
"type" : "completion",
"analyzer" : "simple",
"payloads" : true,
"preserve_separators" : true,
"preserve_position_increments" : true,
"max_input_length" : 50,
"context" : {
"typeTestId" : {
"type" : "category",
"path" : "typeTestId",
"default" : [ ]
}
}
},
"values" : {
"properties" : {
"Att1" : {
"type" : "string"
},
"att2" : {
"type" : "string"
},
"att400" : {
"type" : "date",
"format" : "dateOptionalTime"
}
}
}
}
}
}
}
}
字段值是一个可以通过typeTest编辑的对象,所以如果我在typeTestit中更改某些东西,应该在这里反映出来。如果我创建一个新字段没有问题,但应该可以编辑或删除typeTest中的现有字段。例如,如果我删除values.att1,则所有documentTest都应丢失这些,并且应该更新映射。
对于我所看到的,如果没有重新索引,我们就无法做到这一点。所以现在我的解决方案是删除弹性搜索中的字段,就像提到in this question一样,让工作人员在需要时不时地重新编制索引。
这似乎不是我的解决方案"。有没有更好的方法在elasticsearch中拥有此类型的文档?具有这种灵活性而无需不时重新索引?
答案 0 :(得分:1)
您可以使用Update API删除,添加或修改字段
问题是文档在elasticsearch中是不可变的,因此当您使用更新API进行一些更改时,它将以mark as deleted to old one and add a new one with the updates
的方式执行。
删除和创建新文档对您来说是透明的,因此您不必重新编制索引或执行任何其他操作。如果您打算修改大量文档(例如更新查询以修改5mil文档),则可能会出现问题。对于节点来说,这将非常耗费I / O.
顺便说一下,这也适用于删除