Solr 查询不在嵌套的子文档上
Solr query NOT on nested child documents
如何查询父文档,而子文档 NOT 具有特定字段值?
例如:
假设我们有以下数据结构:
{
"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!"
}
}
如果我想让所有的书都有 "Freeman" 的评论,我会这样做:
&fq={!parent which='type_s:book'}type_s:review AND reviewer_s:Freeman
这将给我两本书。
但是如果我想得到所有 "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 具有 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"'}
此语法还可以解决您在评论中提到的问题
However, what if I have another field, say "reviewer_type" in the
nested documents, and I'd like to filter in a combined way?
type_s:book AND -{!parent which='type_s:book' v='reviewer_s:"Freeman, Gordon" AND type_s:"review"'}
如何查询父文档,而子文档 NOT 具有特定字段值?
例如: 假设我们有以下数据结构:
{
"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!"
}
}
如果我想让所有的书都有 "Freeman" 的评论,我会这样做:
&fq={!parent which='type_s:book'}type_s:review AND reviewer_s:Freeman
这将给我两本书。
但是如果我想得到所有 "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 具有 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"'}
此语法还可以解决您在评论中提到的问题
However, what if I have another field, say "reviewer_type" in the nested documents, and I'd like to filter in a combined way?
type_s:book AND -{!parent which='type_s:book' v='reviewer_s:"Freeman, Gordon" AND type_s:"review"'}