1

我们在弹性搜索中有一个父子(一对多)关系,我们想要检查所有父对象的子对象属性(child_attr)在其中有任何值。

我们正在生成 json 查询,如下所示:

1) 对于有值条件。

{
                "has_child" : {
                  "query" : {
                    "filtered" : {
                      "query" : {
                        "match_all" : { }
                      },
                      "filter" : {
                        "and" : {
                          "filters" : [ {
                            "exists" : {
                              "field" : "child_attr"
                            }
                          }, {
                            "not" : {
                              "filter" : {
                                "term" : {
                                  "child_attr" : ""
                                }
                              }
                            }
                          } ]
                        }
                      }
                    }
                  },
                  "type" : "child"
                }
              }

2) For 无值条件

{
                "has_child" : {
                  "query" : {
                    "filtered" : {
                      "query" : {
                        "match_all" : { }
                      },
                      "filter" : {
                        "or" : {
                          "filters" : [ {
                            "missing" : {
                              "field" : "child_attr"
                            }
                          }, {
                            "term" : {
                              "child_attr" : ""
                            }
                          } ]
                        }
                      }
                    }
                  },
                  "type" : "child"
                }
              } 

这些查询仅返回所有子对象都具有某些值或所有子对象都没有搜索属性值的父对象。

它不会返回部分满足此条件的任何内容,该条件涵盖了大部分数据。

我还玩弄了关键字分析器来索引这个 child_attribute 但没有乐趣。

期待您的专家建议。

4

1 回答 1

1

你得到了意想不到的结果,因为查询

"missing" : {
    "field" : "child_attr"
}

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

查询

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

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

查询

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

不匹配任何东西。

于 2012-12-07T11:37:03.387 回答