我们在弹性搜索中有一个父子(一对多)关系,我们想要检查其子对象属性(child_attr)中有任何值的所有父对象。
我们正在生成json-queries,如下所示:
1)对于Has值条件。
{
"has_child" : {
"query" : {
"filtered" : {
"query" : {
"match_all" : { }
},
"filter" : {
"and" : {
"filters" : [ {
"exists" : {
"field" : "child_attr"
}
}, {
"not" : {
"filter" : {
"term" : {
"child_attr" : ""
}
}
}
} ]
}
}
}
},
"type" : "child"
}
}
2)没有价值条件
{
"has_child" : {
"query" : {
"filtered" : {
"query" : {
"match_all" : { }
},
"filter" : {
"or" : {
"filters" : [ {
"missing" : {
"field" : "child_attr"
}
}, {
"term" : {
"child_attr" : ""
}
} ]
}
}
}
},
"type" : "child"
}
}
这些查询仅返回那些父对象,其中所有子对象都具有某个值,或者所有子对象都没有搜索到的属性值。
它不会返回任何部分满足此条件的内容,这些内容涵盖了大部分数据。
我还玩弄了关键字分析器来索引这个child_attribute,但没有快乐。
请期待您的专家建议。
答案 0 :(得分:1)
由于查询
,您会收到意外结果"missing" : {
"field" : "child_attr"
}
匹配child_attr
中用空字符串索引的记录和缺少child_attr
的记录。
查询
"exists" : {
"field" : "child_attr"
}
是第一个查询的完全相反,它匹配使用非空child_attr
字段编制索引的所有记录。
查询
"term" : {
"child_attr" : ""
}
与任何内容都不匹配。