弹性搜索has_child查询

时间:2012-12-07 09:58:47

标签: elasticsearch

我们在弹性搜索中有一个父子(一对多)关系,我们想要检查其子对象属性(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,但没有快乐。

请期待您的专家建议。

1 个答案:

答案 0 :(得分:1)

由于查询

,您会收到意外结果
"missing" : {
    "field" : "child_attr"
}

匹配child_attr中用空字符串索引的记录和缺少child_attr的记录。

查询

"exists" : {
    "field" : "child_attr"
}

是第一个查询的完全相反,它匹配使用非空child_attr字段编制索引的所有记录。

查询

"term" : {
    "child_attr" : ""
}

与任何内容都不匹配。