3

友達、

何億ものドキュメントから一意のペアを見つけるために分析を行っています。モックの例は次のとおりです。

ドキュメント フィールド1 フィールド2

  1. AAA:BBB
  2. AAA : CCC
  3. PPP : QQQ
  4. PPP : QQQ
  5. XXX : YYY
  6. XXX : YYY
  7. MMM : NNN

ドキュメントの 90% には、上記のドキュメント 3、4、5、6、および 7 に示されているような一意のペアが含まれていますが、集計結果には関心がありません。ドキュメント 1 と 2 を集約することに興味があります。

用語集計クエリ:


    "aggs": {
        "f1": {
            "条項": {
                "フィールド": "FIELD1",
                "min_doc_count": 2
              }、
              "aggs": {
                "f2": {
                      "条項": {
                    「フィールド」:「FIELD2」
                      }
                }
              }
        }
    }

ターム集計結果


    "集計": {
         "f1": {
               "バケツ": [
                 {
                    "キー": "PPP",
                    "doc_count": 2,
                    "f2": {
                        "バケツ": [
                              {
                               "キー": "QQQ",
                            "doc_count": 2
                              }
                         ]
                    }
                  }、
                  {
                    "キー": "XXX",
                    "doc_count": 2,
                    "f2": {
                        "バケツ": [
                              {
                               「キー」:「YYY」、
                            "doc_count": 2
                              }
                         ]
                    }
                  }、
                  {
                    "キー": "AAA",
                    "doc_count": 2,
                    "f2": {
                        "バケツ": [
                              {
                                   "キー": "BBB",
                                "doc_count": 1
                              }、
                              {
                               "キー": "CCC",
                               "doc_count": 1
                              }
                         ]
                    }
                  }
            ]
         }
    }

集計結果に含まれるキーAAAのみに関心があります。異なるペアを含む集計結果をフィルタリングする最良の方法は何ですか?

ユニークな値のカウントを結果とするカーディナリティ集計を試しました。ただし、集計結果から興味のないものを除外することはできません。

カーディナリティ集計クエリ


    "aggs": {
        "f1": {
            "条項": {
                "フィールド": "FIELD1",
                "min_doc_count": 2
              }、
            "aggs": {
                "f2": {
                      "カーディナリティ": {
                        「フィールド」:「FIELD2」
                      }
                }
              }
        }
    }

カーディナリティ集計結果


    "集計": {
        "f1": {
               "バケツ": [
                 {
                    "キー": "PPP",
                    "doc_count": 2,
                    "f2": {
                          「値」: 1
                    }
                  }、
                  {
                    "キー": "XXX",
                    "doc_count": 2,
                    "f2": {
                          「値」: 1
                    }
                  }、
                  {
                    "キー": "AAA",
                    "doc_count": 2,
                    "f2": {
                          「値」: 2
                    }
                  }
            ]
         }
    }

少なくとも基数で並べ替えることができれば、回避策を見つけるのに役立ちます。この点で私を助けてください。

PS: 集計結果を後処理/フィルター処理するための spark/mapreduce プログラムを作成しても、この問題の解決策は期待できません。

4

2 に答える 2

2

field1=AAA のみに関心があるため、集計とともにフィルター クエリを使用することをお勧めします。

ここに同様の例があります。

たとえば、病院のすべての患者のインデックスがあります。ネストされたオブジェクト DRUG に薬物使用を保存します。各患者は異なる薬を服用する可能性があり、それぞれが単一の薬を複数回服用する可能性があります。

ここで、アスピリンを少なくとも 1 回服用した患者の数を知りたい場合、クエリは次のようになります。

{
  "size": 0,
  "_source": false,
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "nested": {
          "path": "DRUG",
          "filter": {
            "bool": {
              "must": [{ "term": { "DRUG.NAME": "aspirin" } }]
  }}}}}},
  "aggs": {
    "DRUG_FACETS": {
      "nested": {
        "path": "DRUG"
      },
      "aggs": {
        "DRUG_NAME_FACETS": {
          "terms": { "field": "DRUG.NAME", "size": 0 },
          "aggs": {
            "DISTINCT": { "cardinality": { "field": "DRUG.PATIENT" } }
          }
  }}}}
}

サンプル結果:

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 6,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "DRUG_FACETS": {
      "doc_count": 11,
      "DRUG_NAME_FACETS": {
        "buckets": [
          {
            "key": "aspirin",
            "doc_count": 6,
            "DISTINCT": {
              "value": 6
            }
          },
          {
            "key": "vitamin-b",
            "doc_count": 3,
            "DISTINCT": {
              "value": 2
            }
          },
          {
            "key": "vitamin-c",
            "doc_count": 2,
            "DISTINCT": {
              "value": 2
            }
          }
        ]
      }
    }
  }
}

バケツの最初のものはアスピリンです。しかし、他の 2 人の患者も、アスピリンを服用したときにビタミン B を服用していたことがわかります。

DRUG.NAME のフィールド値を「vitamin-b」などの別の薬名に変更すると、バケットの最初の位置にビタミン b が表示されると思います。

これがあなたの質問に役立つことを願っています。

于 2014-10-26T06:54:21.647 に答える
0

少し遅れて、他の人に役立つことを願っています。

簡単な方法は、上位の集計で「AAA」レコードのみをフィルタリングすることです。

{
  "size": 0,
  "aggregations": {
    "filterAAA": {
      "filter": {
        "term": {
          "FIELD1": "AAA"
        }
      },
      "aggregations": {
        "f1": {
          "terms": {
            "field": "FIELD1",
            "min_doc_count": 2
          },
          "aggregations": {
            "f2": {
              "terms": {
                "field": "FIELD2"
              }
            }
          }
        }
      }
    }
  }
}
于 2017-08-23T11:33:54.850 に答える