1

Elastic Searchには親子(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)値のない条件の場合

{
                "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 に答える