gpt4 book ai didi

elasticsearch - 如何访问弹性 5.x 上 script_fields 的嵌套属性

转载 作者:行者123 更新时间:2023-11-29 02:52:41 25 4
gpt4 key购买 nike

我需要在无痛 script_fields 上迭代嵌套对象以进行查询,但符号 doc['nestedProperty.property'] 没有给我值,使用数组符号 doc['nestedProperty.property'][0]

知道如何使用它吗?

编辑

文档示例:

{
"neestedProperty": [
{
"property": 12,
"innerNeestedProperty": {
"innerProperty1": 45,
"innerProperty2": -45
}
}
]
}

示例查询:

{
"query": {
match_all: {}
},
"script_fields": {
"scripted": {
"script": {
"inline": "doc['neestedProperty.property'] * params.multiplier",
"params": {
"multiplier": 100
},
"lang": "painless"
}
}
}
}

最佳答案

doc -notation 显然不适用于嵌套对象,但您可以直接访问 _source - 正如 Horst Seirer 指出的那样。

复杂的是访问_source取决于执行脚本的上下文; ctx -变量并不总是可用的。对于 scripted_fields , 你可以改用 params._source .但这在其他上下文中不可用(例如在查询部分)

在您拥有 _source 之后, 访问元素可以用 get 完成,或使用点符号,嵌套字段将是一个数组。所以例如 params._source.nestedProperty[0].property将从第一个嵌套对象获取值。

对于脚本字段,您应该返回一个对象,但它可以是一个数组。所以在你的例子中,我会使用这样的东西:

def returnval=[];
for (nested in params._source.nestedProperty) {
returnval.add(nested['property']*params.multiplier)
}
return returnval;

即使您将源作为参数调用,也不必将其添加到参数列表中。

编辑

如果您需要从父文档的角度编写脚本(也许您需要组合多个嵌套文档),以上内容很有用。

然而,缺点是您只能使用原始源,这意味着未分析的字符串和只是字符串的日期等。

因此,通过包含 script_fields,直接在嵌套文档中直接使用脚本化字段通常会容易得多。在inner_hits部分。像这样:

{
"query": {
"nested": {
"path": "nestedProperty",
"query": {
"match_all": {}
},
"inner_hits": {
"_source": true,
"script_fields": {
"my_value": {
"script": {
"source": "doc['nestedProperty.property'].value*params.multiplier",
"params": {
"multiplier": 100
}
}
}
}
}
}
}
}

这段代码所做的只是单独查看每个嵌套文档(因为它们在内部存储为单独的文档),并在它们上运行脚本。这些(在内部单独存储的)文档可以使用文档符号。

结果将为您提供原始文件,以及 inner_hits 部分其中包含每个嵌套文档及其来源,以及一个脚本字段 my_value .

您将嵌套文档用作单独的条目,但仍然必须使用完整路径 ( nestedProperty.property),这可能只会让您感到奇怪

而且您必须注意这样一个事实,即现在的查询仅返回其中包含 嵌套文档的文档,而之前的代码将返回作为脚本字段为空数组的文档。但是,如果您想要所有文档,您可以使用带有 match_all 的 bool 查询。 -子句。

最后,我不知道这是否适用于 elastic 5(就像最初的问题一样),但我已经在 7.3 上进行了确认,并且根据文档,它也应该适用于例如5.0.

我知道我迟到了,但也许我可以帮助其他人寻找相同的答案。

关于elasticsearch - 如何访问弹性 5.x 上 script_fields 的嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41275228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com