假设我有一个带有嵌套发布值的简化组织文档,如下所示(ES 2.3):
{
"organization" : {
"dateUpdated" : 1395211600000,
"publications" : [
{
"dateCreated" : 1393801200000
},
{
"dateCreated" : 1401055200000
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我想找到所有发布 dateCreated < 组织的 dateUpdated 的组织:
{
"query": {
"nested": {
"path": "publications",
"query": {
"bool": {
"filter": [
{
"script": {
"script": "doc['publications.dateCreated'].value < doc['dateUpdated'].value"
}
}
]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我执行嵌套查询时,嵌套查询无权访问根文档值,因此doc['dateUpdated'].value无效并且我得到 0 个命中。
有没有办法将值传递到嵌套查询中?或者我的嵌套方法在这里完全关闭?如有必要,我想避免仅为出版物创建单独的文档。
谢谢。
您无法从嵌套查询上下文访问根值。它们被索引为单独的文档。从文档
嵌套子句“向下”进入嵌套的注释字段。它没有 再访问根文档中的字段,也不字段的任何其他嵌套文件内。
您可以在copy_to参数的帮助下获得所需的结果。另一种方法是使用include_in_parent或include_in_root但它们将来可能会被弃用,并且还会增加索引大小,因为嵌套类型的每个字段都将包含在根文档中,因此在这种情况下copy_to功能会更好。
这是一个示例索引
PUT nested_index
{
"mappings": {
"blogpost": {
"properties": {
"rootdate": {
"type": "date"
},
"copy_of_nested_date": {
"type": "date"
},
"comments": {
"type": "nested",
"properties": {
"nested_date": {
"type": "date",
"copy_to": "copy_of_nested_date"
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,nested_date 的每个值都将被复制到copy_of_nested_date,所以 copy_of_nested_date 看起来像 [1401055200000,1393801200000,1221542100000] 然后你可以使用这样的简单查询来获得结果。
{
"query": {
"bool": {
"filter": [
{
"script": {
"script": "doc['rootdate'].value < doc['copy_of_nested_date'].value"
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
您不必更改嵌套结构,但在添加到发布 dateCreated后必须重新索引文档copy_to
| 归档时间: |
|
| 查看次数: |
2665 次 |
| 最近记录: |