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

标签 elasticsearch

我需要在无痛 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/

相关文章:

elasticsearch - 有没有办法从Kibana中的另一个Elasticsearch实例检索数据?

elasticsearch - 删除所有搜索响应文档

elasticsearch - 使用动态日期过滤每日时间范围

ElasticSearch 术语聚合

elasticsearch - Elasticsearch:过滤嵌套对象的多个数组

Elasticsearch 搜索土耳其语字符

elasticsearch - 使用Elasticsearch搜索确切的短语

elasticsearch - Elasticsearch 中的得分不一致

elasticsearch - ElasticSearch按完全匹配搜索电子邮件

sorting - 使用NEST 7进行ElasticSearch排序