【发布时间】:2017-08-09 19:14:07
【问题描述】:
我创建了一个脚本,该脚本记录了在弹性文档中应用的标签的历史记录。标签的名称是动态的,所以当我尝试将当前标签移动到历史字段时,对于还没有历史字段的标签会失败。
这是我将当前标签复制到标签历史字段的脚本:
script:"ctx._source.tags[params.tagName.toString()].history.add(ctx._source.tags[params.tagName.toString()].current)"
这是文档的样子:
"tags": {
"relevant": {
"current": {
"tagDate": 1501848372292,
"taggedByUser": "dev",
"tagActive": true
},
"history": [
{
"tagDate": 1501841137822,
"taggedByUser": "admin",
"tagActive": true
},
{
"tagDate": 1501841334127,
"taggedByUser": "admin",
"tagActive": true
},
}}}}
用户可以动态添加新标签,所以我想做的是创建历史对象,如果它不存在,然后我可以填充它。
弹性搜索脚本可用的文档很少,所以我希望明智的人知道答案,因为我确信检查字段并创建它是弹性脚本语言的基本内容。
更新
所以,重新考虑了这个索引的结构,我想要实现的是:
tags:[
{hot:
{current:{tagDate:1231231233, taggedbyUser: user1, tagStatus: true},
history:[ {tagDate:123444433, taggedbyUser: user1, tagStatus: true},
{tagDate:1234412433, taggedbyUser: user1, tagStatus: true}
]
}
{interesting:
{current:{tagDate:1231231233, taggedbyUser: user1, tagStatus: true},
history:[ {tagDate:123444433, taggedbyUser: user1, tagStatus: true},
{tagDate:1234412433, taggedbyUser: user1, tagStatus: true}
]
}
]
此示例中的标签名称是“热门”和“有趣”,但是用户可以输入他们想要的任何标签名称,因此这些名称绝不是预定义的。当用户在弹性中标记文档并且应用的标签已经存在于弹性中时,它应该将“当前”标签添加到“历史”数组中,然后用新值覆盖“当前”标签。
感谢您迄今为止的回复,但是示例代码对我不起作用。
我认为我遇到的问题是,首先代码需要遍历所有标签并获取名称。然后我想将这些中的每一个与我在参数中提供的名称进行比较。我认为这是第一个问题出现的地方。
然后我需要将“当前”对象移动到“历史”数组。这里似乎也有问题。我正在尝试使用“ctx._source.tags[i].history.add(params.param1),但是没有添加任何内容。
有什么想法吗?
谢谢!
【问题讨论】:
标签: elasticsearch