5

我在 ES 中使用嵌套文档。我在一个实体中嵌套了数组,我希望能够使用嵌套查询过滤数组(不仅过滤根/父文档,还过滤嵌套数组)。

嵌套过滤器可以过滤根文档。例如,如果我有索引'blogs'并输入'blog'并且在博客文档中我有属性'comments'(评论数组),映射中有{“type”:“nested”},所以例如我想过滤具有“今天”标题的评论的博客(例如匹配查询),但在每个博客中,我也想只显示标题中包含“今天”的评论。

我知道嵌套过滤器是如何工作的。同样,子父关系也不适用于此目的,因为没有子文档作为父文档的一部分作为响应。

有什么方法可以直接在elasticsearch中执行此操作,而无需向应用程序添加额外的逻辑,这可能会影响性能?或者是否有计划在下一个版本的嵌套查询/过滤器或类似的东西中将此作为新选项添加​​?

谢谢

...添加

例如,看看这个文档:

......
“博客”:[
    {
         “身份证”:1000,
         "content":"你好世界!!!",
         “作者:“埃文”,
         "createTime":"2013-05-31",
          “注释” : [
                   {"author":"jack", id:"1", "content":"test test","createTime":"2013-05-31"},
                   {"author":"tom", id:"2", "content":"test test","createTime":"2013-05-30"},
                   {"author":"oliver", id:"3", "content":"test test","createTime":"2013-05-30"},
                   {"author":"Jonesie", id:"4", "content":"test test","createTime":"2013-05-29"}
           ]
    },
    {
         “身份证”:1001,
         “内容”:“测试数据”,
         “作者:“杰克”,
         "createTime":"2013-05-30",
          “注释” : [
                   {"author":"Zach", id:"11", "content":"测试数据 1","createTime":"2013-05-31"},
                   {"author":"tom", id:"21", "content":"测试数据 2","createTime":"2013-05-31"},
                   {"author":"oliver", id:"31", "content":"test test 3","createTime":"2013-05-28"},
                   {"author":"Jonesie", id:"41", "content":"test test 4","createTime":"2013-05-27"}
           ]
    }
]
......

我想运行如下查询:

按 blogs.createTime == '2013-05-31' 过滤并过滤 blogs.comments.createTime=='2013-05-31'

预计 :

......
“博客”:[
    {
         “身份证”:1000
         "content":"你好世界!!!",
         "作者::"埃文",
         “创建时间”:“2013-05-31”
          “注释” : [
                   {"author":"jack", id:"1", "content":"test test","createTime":"2013-05-31"}
           ]
    }
]
……

谢谢

4

1 回答 1

1

简而言之:你不能。您需要在自己的代码中过滤嵌套文档。

这是一个已知问题:

“将匹配的嵌套文档公开给查询和排序” https://github.com/elasticsearch/elasticsearch/issues/1383

“每次点击返回匹配的嵌套内部对象。”

https://github.com/elasticsearch/elasticsearch/issues/3022

于 2013-05-31T15:20:02.937 回答