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