【问题标题】:Solr query NOT on nested child documentsSolr 查询不在嵌套子文档上
【发布时间】:2016-04-23 23:32:45
【问题描述】:

如何查询父文档,而子文档没有具有特定字段值?

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

    {
        "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)

这给了我所有的父文件。

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

&fq={!parent which='type_s:book'}type_s:review AND -reviewer_s:["" TO *]

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

【问题讨论】:

    标签: solr lucene nested


    【解决方案1】:

    如果 solr 具有 elasticsearch 中的 include_in_parent 之类的功能,那将是可以实现的。但是,如果您以不同的方式对数据进行索引,您将能够实现您想要的。您需要将审阅者索引为父文档中的多值字段(实际上,当您使用 include_in_parent 时,elasticsearch 在幕后做了这件事情):

    [{                                                                                                                                                                                                        
        "type_s": "book",                                                                                                                                                                                     
        "id": 4294967298,                                                                                                                                                                                     
        "title_s": "The Little Mermaid",                                                                                                                                                                      
        "reviewers_ms": ["Freeman, Gordon", "Denton, J.C."],                                                                                                                                                  
        ...                                                                                                                                                                                                   
    }, {                                                                                                                                                                                                      
        "type_s": "book",                                                                                                                                                                                     
        "id": 4294967299,                                                                                                                                                                                     
        "title_s": "Lion King",                                                                                                                                                                               
        "reviewers_ms": ["Woods, Susanne", "Denver, Michel"],                                                                                                                                                 
        ...                                                                                                                                                                                                   
    }, {                                                                                                                                                                                                      
        "type_s": "book",                                                                                                                                                                                     
        "id": 4294967300,                                                                                                                                                                                     
        "title_s": "7 dwarves",                                                                                                                                                                               
        "reviewers_ms": ["Freeman, Gordon", "Delacroix, Marie"],                                                                                                                                              
        ...                                                                                                                                                                                                   
    }]
    

    然后,如果您按以下条件过滤,您将得到想要的结果:

    type_s:book AND -reviewers_ms:"Freeman, Gordon"
    

    更新

    我找到了一种无需特殊索引即可解决问题的方法。这个过滤器对我有用:

    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"'}
    

    【讨论】:

    • 我明白了,你说得对,这适用于给定的例子。但是,如果我有另一个字段,例如嵌套文档中的“reviewer_type”,并且我想以组合方式进行过滤,该怎么办?这实际上就是我首先使用嵌套文档的原因。我得到了组合过滤器,它有两个部分,一个类型和一个名称。执行查询时,我只想要匹配两个过滤器部分的结果。首先,我使用了 2 个单独的多值字段,但这会导致误报匹配,如下所述:stackoverflow.com/questions/5584857/…
    • @SebastianRiemer,我找到了一种无需特殊索引即可过滤的方法。查看我的答案的更新
    • 再次感谢!我已设法将您的示例应用于我的真实数据,并且按预期工作。
    猜你喜欢
    • 2017-03-22
    • 2022-11-07
    • 1970-01-01
    • 2018-03-09
    • 2020-11-28
    • 2013-08-28
    • 1970-01-01
    • 2016-12-04
    • 2017-09-13
    相关资源
    最近更新 更多