可以在一组条款中搜索所有父/子作为OR,其中任何父文档或子文档包含任何搜索词,如下所示:
query:
bool:
should:
match:
_all: "term1 term2"
has_child:
type: childtype1
query:
match:
_all: "term1 term2"
但是如何搜索这样我返回父文档,其中父文档字段及其所有子文档字段的联合包含搜索项的并集?也就是说,所有条款都包含在父文档或其子文档中?
答案 0 :(得分:2)
你做不到。
您一次只能对一个文档强制执行设置限制。父母和子女是相互独立评估的(他们是独立的文件),这意味着没有办法要求所有条款在父母和孩子之间传播的文件。所有条款都需要在父母或孩子身上,或者你必须容忍一些缺失的条款。
如果进行非规范化,则可以获得此行为。例如,将所有子项都放在父文档中。然后,您可以只搜索父文档中的术语联合,并使用父/子关系进行任何其他过滤/搜索。
答案 1 :(得分:0)
这很昂贵,但如果您可以通过编程方式构建查询,则看起来可以使用过滤完成。
{
query: {
filtered: {
filter: {
and: [
{
or: [
{
term: {
_all: term1
}
}, {
has_child: {
type: childtype1,
query: {
term: {
_all: term1
}
}
}
}
],
or: [
{
term: {
_all: term2
}
}, {
has_child: {
type: childtype1,
query: {
term: {
_all: term2
}
}
}
}
]
}
]
}
},
bool: {
should: {
match: {
_all: "term1 term2"
},
has_child: {
type: childtype1,
query: {
match: {
_all: "term1 term2"
}
}
}
}
}
}
}