Elasticsearch 2.20 입문서: 집합 작업

집합(Aggregations)은 문서를 그룹화하고 통계하는 능력을 제공합니다.집합 유사 관계 데이터베이스에서 그룹 by 그룹을 나누는 기능은 Elasticsearch에서 한 번의 집합 조회에서 집합의 구체적인 결과를 동시에 얻을 수 있는 집합을 다시 집합하는 데 매우 유용한 기능이다.너는 한 번의 조작을 통해 여러 번의 집합 결과를 얻어 여러 번의 요청을 피하고 네트워크와 서버의 부담을 줄일 수 있다.
데이터 준비: 몇 가지 데이터를 삽입합니다.
요청: POST localhost: 9200/customer/external/?pretty
매개변수:
{"name": "secisland","age":25,"state":"open","gender":"woman","balance":87 }
{"name": "zhangsan","age":32,"state":"close","gender":"man","balance":95 }
{"name": "zhangsan1","age":33,"state":"close","gender":"man","balance":91 }
{"name": "lisi","age":34,"state":"open","gender":"woman","balance":99 }
{"name": "wangwu","age":46,"state":"close","gender":"woman","balance":78 }
이 중 5개의 데이터를 삽입하여 테스트한다.
데이터가 확보되면 우리는 집합 테스트를 진행한다.
예: 모든 고객을 상태별로 그룹화한 다음 상위 10(기본값) 상태로 돌아가 통계(기본값)로 정렬합니다.
요청: POSThttp://localhost:9200/customer/_search?pretty
매개변수:
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      }
    }
  }
}

이 검색 조건은 관계 데이터베이스에 있는 그룹 by와 유사합니다.
SELECT state, COUNT(*) FROM customer GROUP BY state ORDER BY COUNT(*) DESC

반환 결과:
 {
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 5,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : "close",
        "doc_count" : 3
      }, {
        "key" : "open",
        "doc_count" : 2
      } ]
    }
  }
}

우리는 그 중에서 알 수 있듯이 2개의close상태의 고객, 2개의open상태의 사용자가 있다.
다음은 우리가 위에서 다시 한 가지 기능을 추가하는 것이 바로 통계 상태와 동시에 각 상태의 평균 잔액을 계산하는 것이다.
요청은 아까와 같지만 매개 변수가 변경되었습니다. 아래 매개 변수를 보십시오.
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

조회 결과는 다음과 같습니다.
{
  "took" : 16,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 5,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : "close",
        "doc_count" : 3,
        "average_balance" : {
          "value" : 88.0
        }
      }, {
        "key" : "open",
        "doc_count" : 2,
        "average_balance" : {
          "value" : 93.0
        }
      } ]
    }
  }
}

그룹에 어떻게 끼워 넣는지 자세히 살펴보세요_by_state 모으기 중average_밸런스 모으기.이것은 집합의 흔히 볼 수 있는 모델이다.집합 후 임의의 필드를 다시 집합하여 우리가 원하는 결과를 얻을 수 있다.
아래의 예를 보면 우리는 위에서 얻은 결과에서 다시 평균 계좌 금액에 대해 순서를 낮추어 배열한다.
요청은 이전과 같습니다.
매개변수:
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

조회 결과:
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 5,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_state" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : "open",
        "doc_count" : 2,
        "average_balance" : {
          "value" : 93.0
        }
      }, {
        "key" : "close",
        "doc_count" : 3,
        "average_balance" : {
          "value" : 88.0
        }
      } ]
    }
  }
}

본고는 세크람드(secisland)가 창작한 것으로 작가와 출처를 명시해 주십시오.
다음 예는 비교적 복잡하다. 어떻게 연령대(연령 20-29세, 30-39세, 40-49)를 통과한 다음에 성별을 통해 마지막으로 각 연령대, 각 성별의 평균 계좌 잔액을 얻는지 보여준다.
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_gender": {
          "terms": {
            "field": "gender"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}

쿼리된 반환 결과:
{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 5,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "group_by_age" : {
      "buckets" : [ {
        "key" : "20.0-30.0",
        "from" : 20.0,
        "from_as_string" : "20.0",
        "to" : 30.0,
        "to_as_string" : "30.0",
        "doc_count" : 1,
        "group_by_gender" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [ {
            "key" : "woman",
            "doc_count" : 1,
            "average_balance" : {
              "value" : 87.0
            }
          } ]
        }
      }, {
        "key" : "30.0-40.0",
        "from" : 30.0,
        "from_as_string" : "30.0",
        "to" : 40.0,
        "to_as_string" : "40.0",
        "doc_count" : 3,
        "group_by_gender" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [ {
            "key" : "man",
            "doc_count" : 2,
            "average_balance" : {
              "value" : 93.0
            }
          }, {
            "key" : "woman",
            "doc_count" : 1,
            "average_balance" : {
              "value" : 99.0
            }
          } ]
        }
      }, {
        "key" : "40.0-50.0",
        "from" : 40.0,
        "from_as_string" : "40.0",
        "to" : 50.0,
        "to_as_string" : "50.0",
        "doc_count" : 1,
        "group_by_gender" : {
          "doc_count_error_upper_bound" : 0,
          "sum_other_doc_count" : 0,
          "buckets" : [ {
            "key" : "woman",
            "doc_count" : 1,
            "average_balance" : {
              "value" : 78.0
            }
          } ]
        }
      } ]
    }
  }
}

위의 예에서 알 수 있듯이 Elasticsearch의 집합 능력은 매우 강하다.
세크랜드(secisland)는 후속적으로 Elasticsearch의 최신 버전의 각종 기능을 점차적으로 분석할 것이니 기대해 주십시오. 또한 secisland 공중호에 가입하여 관심을 가지는 것을 환영합니다.

좋은 웹페이지 즐겨찾기