2.X/4. Aggregations

4-10-1. Doc Values

drscg 2017. 9. 23. 22:40

Aggregations work via a data structure known as doc values (briefly introduced in Doc Values Intro).Doc values are what make aggregations fast, efficient and memory-friendly, so it is useful to understand how they work.

aggregation은 doc values (Doc Values Intro에서 간단히 소개된)로 알려진 데이터 구조를 통해, 동작한다.doc values는 aggregation을 빠르게, 효율적으로, 메모리 친화적으로 만든다. 때문에, 그것이 동작하는 방법을 이해하는 것은 중요하다.

Doc values exists because inverted indices are efficient for only certain operations. The inverted index excels at finding documents that contain a term. It does not perform well in the opposite direction: determining which terms exist in a single document. Aggregations need this secondary access pattern.

inverted indices가 특정 작업에 대해서만 효율적이기 때문에, doc values는 존재한다. inverted index는 단어를 포함하는 document를 찾는 것에 탁월하다. 반대(어떤 하나의 document에 단어가 존재하는지를 판단하는 것)로는 잘 동작하지 않는다. aggregation은 이 두 번째 액세스 형태가 필요하다.

Consider the following inverted index:

다음의 inverted index를 고려해 보자.

Term      Doc_1   Doc_2   Doc_3
------------------------------------
brown   |   X   |   X   |
dog     |   X   |       |   X
dogs    |       |   X   |   X
fox     |   X   |       |   X
foxes   |       |   X   |
in      |       |   X   |
jumped  |   X   |       |   X
lazy    |   X   |   X   |
leap    |       |   X   |
over    |   X   |   X   |   X
quick   |   X   |   X   |   X
summer  |       |   X   |
the     |   X   |       |   X
------------------------------------

If we want to compile a complete list of terms in any document that mentions brown, we might build a query like so:

brown 을 언급하는 document에서, 단어의 완벽한 목록을 만들려면, 아래와 같은 query를 만들어야 한다.

GET /my_index/_search
{
  "query" : {
    "match" : {
      "body" : "brown"
    }
  },
  "aggs" : {
    "popular_terms": {
      "terms" : {
        "field" : "body"
      }
    }
  }
}

The query portion is easy and efficient. The inverted index is sorted by terms, so first we find brownin the terms list, and then scan across all the columns to see which documents contain brown. We can very quickly see that Doc_1 and Doc_2 contain the token brown.

query 부분은 간단하고 효율적이다. inverted index는 단어를 기준으로 정렬된다. 그래서, 먼저 단어 목록에서 brown 을 찾고, 그 다음에 brown 을 포함하는 document를 찾기 위해, column 전부를 검색한다. Doc_1 과 Doc_2 가 token brown 을 포함하는 것을, 매우 빠르게 알 수 있다.

Then, for the aggregation portion, we need to find all the unique terms in Doc_1 and Doc_2. Trying to do this with the inverted index would be a very expensive process: we would have to iterate over every term in the index and collect tokens from Doc_1 and Doc_2 columns. This would be slow and scale poorly: as the number of terms and documents grows, so would the execution time.

그 다음에 aggregation 부분에서, Doc_1 과 Doc_2 에 있는 유일한 단어 모두를 검색해야 한다. inverted index에서 이렇게 하면, 비용이 매우 많이 드는 프로세스가 될 것이다. index에서 모든 단어에 대해 반복해야 하고, Doc_1 과 Doc_2 의 column에서 token을 수집해야 한다. 이것은 매우 느리고, 조정도 어렵다. 단어와 document의 수가 증가할수록, 실행 시간도 증가할 것이다.

Doc values addresses this problem by inverting the relationship. While the inverted index maps terms to the documents containing the term, doc values maps documents to the terms contained by the document:

doc values는 그 관계를 반대로 하여, 이 문제를 해결한다. inverted index는 단어들을 단어를 포함하고 있는 document에 mapping하는 반면에, doc values는 document를 document에 포함된 단어에 mapping한다.

Doc      Terms
-----------------------------------------------------------------
Doc_1 | brown, dog, fox, jumped, lazy, over, quick, the
Doc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summer
Doc_3 | dog, dogs, fox, jumped, over, quick, the
-----------------------------------------------------------------

Once the data has been uninverted, it is trivial to collect the unique tokens from Doc_1 and Doc_2. Go to the rows for each document, collect all the terms, and take the union of the two sets.

일단 데이터가 uninverted되면, Doc_1 과 Doc_2 에서 유일한 token을 수집하는 것은 간단하다. 각 document의 행으로 가서, 단어 모두를 수집하고, 두 집합을 조합하면 된다.

Thus, search and aggregations are closely intertwined. Search finds documents by using the inverted index. Aggregations collect and aggregate values from doc values.

따라서, 검색과 aggregation은 밀접하게 엮여 있다. 검색은 inverted index를 이용하여, document를 찾는다. aggregation은 doc values에서 값을 수집하고 aggregation한다.

Note

Doc values are not just used for aggregations. They are required for any operation that must look up the value contained in a specific document. Besides aggregations, this includes sorting, scripts that access field values and parent-child relationships (see Parent-Child Relationship).

doc values가 aggregation에만 사용되는 것은 아니다. 특정 document에 포함된 값을 조회해야 하는 모든 연산에 필요하다. 이것은 aggregation 이외에도, 정렬, field 값에 액세스하는 scripts, 부모-자식 관계(Parent-Child Relationship 참조)를 포함한다.


'2.X > 4. Aggregations' 카테고리의 다른 글

4-09-1. significant_terms Demo  (0) 2017.09.23
4-10. Doc Values and Fielddata  (0) 2017.09.23
4-10-2. Deep Dive on Doc Values  (0) 2017.09.23
4-10-3. Aggregations and Analysis  (0) 2017.09.23
4-10-4. Limiting Memory Usage  (0) 2017.09.23