Solr查询不在嵌套子文档上

Solr查询不在嵌套子文档上,solr,lucene,nested,Solr,Lucene,Nested,如果子文档没有某个字段值,如何查询父文档 例如: 假设我们有以下数据结构: { "type_s": "book", "id_l": 4294967298, "title_s": "The Little Mermaid" { "type_s": "review", "id_l": "4294967451", "reviewer_s": "Fr

如果子文档没有某个字段值,如何查询父文档

例如: 假设我们有以下数据结构:

    {
        "type_s": "book",
        "id_l": 4294967298,
        "title_s": "The Little Mermaid"
        {
            "type_s": "review",
            "id_l": "4294967451",       
            "reviewer_s": "Freeman, Gordon",        
            "comment_s": "Great book!"      
        },
        {
            "type_s": "review",
            "id_l": "4294967452",       
            "reviewer_s": "Denton, J.C.",       
            "comment_s": "My daughter loved it!"        
        }
    },
{
        "type_s": "book",
        "id_l": 4294967298,
        "title_s": "Lion King"
        {
            "type_s": "review",
            "id_l": "4294967457",       
            "reviewer_s": "Woods, Susanne",     
            "comment_s": "One of the best!"     
        },
        {
            "type_s": "review",
            "id_l": "4294967458",       
            "reviewer_s": "Denver, Michel",     
            "comment_s": "Liked the ending!"        
        }
    },
    {
        "type_s": "book",
        "id_l": 4294967298,
        "title_s": "7 dwarves"
        {
            "type_s": "review",
            "id_l": "4294967453",       
            "reviewer_s": "Freeman, Gordon",        
            "comment_s": "Great book!"      
        },
        {
            "type_s": "review",
            "id_l": "4294967454",       
            "reviewer_s": "Delacroix, Marie",       
            "comment_s": "Too many dwarves!"        
        }
    }
如果我想让所有的书都有“弗里曼”的评论,我会这样做:

&fq={!parent which='type_s:book'}type_s:review AND reviewer_s:Freeman
这将给我两本书作为结果

但如果我想让所有的书都没有“弗里曼”的评论,我该怎么办

我试过这样做

&fq={!parent which='type_s:book'}type_s:review AND reviewer_s:(NOT Freeman)
这给了我0个结果

还有这个

&fq={!parent which='type_s:book'}type_s:review AND NOT reviewer_s:Freeman)
这会给我所有的父文档

下面的内容更有希望,它给了我一些结果(在我的实际用例中)


请注意,我也尝试使用单引号中的搜索词进行查询。

如果solr具有类似于include\u in\u parentin这样的功能,这将是可以实现的。然而,如果您以稍微不同的方式索引数据,您将能够实现您想要的。您需要将审阅者作为父文档中的多值字段编制索引(实际上,当您使用
在父文档中包含时,elasticsearch在幕后做了这件事):

[{
“类型”:“书籍”,
“id”:4294967298,
“小美人鱼”,
“评论员”:[“弗里曼,戈登”,“丹顿,J.C.”,
...                                                                                                                                                                                                   
}, {                                                                                                                                                                                                      
“类型”:“书籍”,
“id”:4294967299,
“头衔”:“狮子王”,
“评论家”:[“伍兹,苏珊娜”,“丹佛,米歇尔”],
...                                                                                                                                                                                                   
}, {                                                                                                                                                                                                      
“类型”:“书籍”,
“id”:4294967300,
“七个小矮人”,
“评论家”:[“弗里曼,戈登”,“德拉克罗伊,玛丽”],
...                                                                                                                                                                                                   
}]
然后,如果您通过以下方式进行筛选,您将得到想要的结果:

type_s:book AND -reviewers_ms:"Freeman, Gordon"
更新 我找到了一种不用特殊索引就能解决问题的方法。这个过滤器对我有效:

type_s:book AND -{!parent which='type_s:book' v='reviewer_s:"Freeman, Gordon"'}
此语法还应该修复您在评论中提到的问题

但是,如果我有另一个字段,在 嵌套文档,我希望以组合方式进行筛选


如果solr具有像“在父项中包含”这样的功能,这是可以实现的。然而,如果您以稍微不同的方式索引数据,您将能够实现您想要的。您需要将审阅者作为父文档中的多值字段编制索引(实际上,当您使用
在父文档中包含时,elasticsearch在幕后做了这件事):

[{
“类型”:“书籍”,
“id”:4294967298,
type_s:book AND -{!parent which='type_s:book' v='reviewer_s:"Freeman, Gordon"'}
type_s:book AND -{!parent which='type_s:book' v='reviewer_s:"Freeman, Gordon" AND type_s:"review"'}