假设我有一个简化的组织文档,其嵌套的发布值如此(ES 2.3):
{
"organization" : {
"dateUpdated" : 1395211600000,
"publications" : [
{
"dateCreated" : 1393801200000
},
{
"dateCreated" : 1401055200000
}
]
}
}
我想找到所有发布dateCreated<的组织组织的dateUpdated:
{
"query": {
"nested": {
"path": "publications",
"query": {
"bool": {
"filter": [
{
"script": {
"script": "doc['publications.dateCreated'].value < doc['dateUpdated'].value"
}
}
]
}
}
}
}
}
我的问题是,当我执行嵌套查询时,嵌套查询无权访问根文档值,因此doc['dateUpdated'].value
无效,我得到0次点击。
有没有办法将值传入嵌套查询?或者我的嵌套方法完全在这里?如果有必要,我想避免为出版物创建单独的文档。
感谢。
答案 0 :(得分:3)
您无法从嵌套查询上下文中访问根值。它们被索引为单独的文档。来自documentation
嵌套子句“降低”到嵌套注释字段中。它没有 更长的时间可以访问根文档中的字段,也可以访问任何字段 其他嵌套文档。
您可以借助copy_to参数获得所需的结果。另一种方法是使用 include_in_parent 或 include_in_root ,但将来它们可能是deprecated,它也会增加索引大小,因为每个嵌套字段都是如此类型将包含在根文档中,因此在这种情况下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"
}
}
}
}
}
}
}
此处 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"
}
}
]
}
}
}
您不必更改嵌套结构,但在将copy_to
添加到发布dateCreated