Like this post? Love numbers and Elasticsearch? I’ll be at Elastic{ON} to meet with attendees face to face and answer your questions. Consider attending the event. Hope to see you there.
Imagine being able index your calendar to quickly find all events whose time range conflicts with a proposed event. Or creating a global television guide to find all shows, movies, sports, or broadcasts that are aired during certain time periods. Looking for something even more futuristic? Imagine creating a catalog of spectral signatures for all known cancer cells in order to more rapidly identify, classify, and diagnose potential malignant activity.
새로운 event와 일정이 겹치는 모든 event를 빠르게 찾을 수 있는 calendar를 index하거나 또는 특정 기간 동안 방송되는 모든 쇼, 영화, 스포츠, 방송을찾기 위한 전체 TV guide를 생성한다고 가정해 보자. 잠재적인 악성 활동을 보다 신속하게 식별, 분류, 진단하기 위하여, 알려진 모든 암 세포에 대한 spectral signatures 의 분류를 생성한다고 가정해 보자.
From discrete to continuous
Until recently, these use cases have been extremely difficult, or next to impossible, to solve at scale using Elasticsearch's discrete numeric and date fields. While running range queries over discrete points are the most typical and widely used capability, it quickly became clear that having the ability to index and search over continuous ranges would be a tremendously useful feature to support. Thanks to recent advancements in Apache Lucene this desire has become a reality in Elasticsearch.
최근까지, 이런 사용 사례에서는 Elasticsearch의 개별 numeric 과 date field를 사용하여, 대규모로 처리하기가 아주 어렵거나 불가능했다. 개별 point에 대해 range query를 실행하는 것이 가장 일반적이고 널리 사용되는 기능이지만, 연속된 범위에 대해 index하고 search하는 기능을 지원하는 것이 대단히 유용한 기능이라는 점은 분명해졌다. Apache Lucene 의 최근 발전으로 인해, 이러한 요구가 Elasticsearch 에서 구현되었다.
Elasticsearch welcomes Numeric and Date Range field types
We are proud to announce the following new Range field types are included in the Elasticsearch 5.2 release:
Elasticsearch 5.2 출시롸 함께 다음과 같은 새로운 range field type을 소개하게 되어 기쁘게 생각한다.
integer_range
float_range
long_range
double_range
date_range
The mapping definition for these new range data types work the same way as their discrete Numeric and Date counterparts. The following provides an example mapping definition for a document type (called "conference") that contains both an integer and date range:
새로운 range data type에 대한 mapping 정의는 개별 numeric과 date 형식과 동일한 방식으로 동작한다. 다음은 integer와 data 범위 모두를 포함하는 document type에 대한 mapping 정의의 예이다.
PUT events/ { "mappings" : { "conference" : { "properties" : { "expected_attendees" : { "type" : "integer_range" }, "time" : { "type" : "date_range", "format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } }
Indexing a document using the above mapping is as simple as defining the range fields the same way you would in a Numeric or Date Range Query. Like Date Range queries, indexing a Date Range field also uses the same Date Math format definition. The following example demonstrates indexing a document with an integer_range and date_range field type:
위의 mapping을 사용하여 document를 index하는 것은 Numeric 과 Date range query에서와 동일한 방식으로 range field를 정의하는 것과 마찬가지로 간단하다. date range query와 마찬가지로, date range field를 index하는 것도 동일한 date 계산 정의를 이용한다. 다음 예는 integer_range와 date_range field type을 가진 document를 index한다.
PUT events/conference/1 { "title" : "Pink Floyd / Wizard of Oz Halloween Trip", "expected_attendees" : { "gte" : 100000, "lt" : 200001 }, "time" : { "gte" : "2015-10-31 12:00", "lt" : "2015-11-01" } }
Querying Numeric and Date Range fields use the same Range Query domain specific language (DSL) definition as before with the addition of a new optional relation parameter. This parameter enables the user to define the type of Range query desired. This is defined as one of: INTERSECTS
(default), CONTAINS
, or WITHIN
and can be combined with other Boolean queries to achieve different desired results (e.g., DISJOINT
). The following example demonstrates a WITHIN
query over the events index:
numeric과 date range field를 query는 새로운 option인 relation 매개변수를 사용하여, 이전과 동일한 Range Query DSL을 사용한다. 이 매개변수를 사용하여 원하는 range query의 유형을 정의할 수 있다. 이는 INTERSECTS(기본), CONTAINS, WITHIN 중 하나로 정의되며, 다른 boolean query와 조합하여 다른 원하는 결과(예: DISJOINT)를 얻을 수 있다. 다음 예는 event index에서 WITHIN query를 사용한 예이다.
GET events/_search { "query" : { "range" : { "time" : { "gte" : "2015-10-01", "lte" : "2015-12-31", "relation" : "within" } } } }
Like discrete numeric and date fields their new range counterparts are restricted to a single dimension only. In the future we plan to lift this restriction and expand them to handle 8 and 4 dimensions, respectively.
개별 numeric, date field와 마찬가지로, 새로운 range 형식은 단일 차원으로만 제한된다. 앞으로, 이 제한을 넘어, 8, 4 차원을 처리하도록 확장할 계획이다.
Lucene implementation
On October 18th, we published a blog post describing The Evolution of Numeric Range Filters in Apache Lucene. This historical account of Lucene’s maturation as a numeric search engine details the technical advancements of numeric indexing and search culminating in the Bkd-Tree Data Structure. Instead of continuing to represent numeric data using a structure specifically designed and tuned for text, the Bkd implementation introduced the first flexible tree structure designed specifically for indexing discrete numeric points. These discrete points can now be searched in Elasticsearch using the numeric range query DSL definition. Built around the theory and concepts of a k-dimensional tree (k-d tree), the new Points codec format also paved the way for providing multi-dimensional support for more advanced scientific or data analysis use cases and provide the foundation classes needed to bring the range field feature to Lucene and ultimately to Elasticsearch.
10월 18일, Apache Lucene의 Numeric Range Filters의 진화를 설명하는 게시물을 게시했다. numeric search engine으로써 Lucene의 성숙도의 역사에 대한 이 설명은 Bkd-Tree Data Structure 에서 정점에 이른 numeric index와 search의 기술적 진보에 대해 자세히 설명한다. text를 위해 특별히 설계되고 조정된 structure를 사용하여 numeric data를 계속 표시하는 대신, Bkd 구현은 개별 numeric point를 index하기 위해 특별히 설계된 최초의 유연한 tree structure를 도입하였다. 이제 Elasticsearch에서는, numeric range query DSL 정의를 이용하여 개별 numeric point를 search할 수 있다. k-dimensional tree (k-d tree)의 이론과 개념을 토대로 만들어진, 새로운 Points codec 형식은 고급 과학이나 data 분석에 대한 다차원 지원을 제공하고, Lucene과 궁극적으로는 Elasticsearh에서 range field 기능을 활용하기 위한 기반 class를 제공한다.
Indexing
The solution was fairly trivial: for each dimension, represent the dimensional numeric range as a 2 dimensional point where the encoding is stored as an array of minimum values, d, (for each dimension) followed by an array of maximum values, D. This means for the Bkd restriction of 8 dimensions the numeric range fields provided by Lucene only support indexing up to 4 dimensional ranges. The image below provides a simple illustration of Lucene’s dimensional range encoding.
해결책은 매우 사소한 것이었다. 각 차원에 있어, 차원 numeric range를 2차원 point로 니타내는 것이다. 여기서 인코딩은 최소값의 배열 d(각 차원별로)를 저장하고, 최대값 배열 D가 이어진다. 이것은 8 차원 Bkd 제한으로 인해, Lucene에 의해 제공되는 numeric range field는 4 차원 range까지만 지원한다는 것을 의미한다. 다음 그림은 Lucene 다차원 range encoding을 간단히게 보여준다.
Essentially, to Lucene a 1-dimension range simply looks like a 2-dimension point. This encoding is then passed to the Bkd indexer which proceeds to build a hierarchical tree of d*2-dimensional points; where d is the dimension of the range, or 4 in the above illustration.
근본적으로, Lucene에서 1차원 range는 단순히 2차원 point로 보인다. 그 다음에 이 encoding은 Bkd indexer로 전달다고, 이 indexer는 d*2 차원의 point의 계층 tree를 형성한다. 여기서 d 는 range의 차원 또는 위 그림의 4이다.
Searching
Implementing search for dimensional ranges boiled down to one critical step - defining and computing the spatial relation between the user provided search range (the target) and the indexed ranges (or minimum bounding ranges at each level of the tree). This was accomplished by implementing a dimensional range comparator that evaluates the range relation at each dimension. The spatial relations implemented in the comparator, and thus by Lucene numeric range queries, include: INTERSECTS, CONTAINS, and WITHIN. DISJOINT queries are then accomplished using an INTERSECTS query contained in a boolean query with a MUST_NOT clause. For multi-value fields a document is only considered DISJOINT if all values are disjoint. CROSSES relations are currently in-work and planned as a future enhancement. The following image illustrates the computed relations between two simple 1 dimensional ranges.
사용자가 제공한 search range(대상)과 index tange(또는 tree의 각 수준에서의 최소 경계 범위)간의 공간 relation을 정의하고 계산하는 중요한 단계로 요약하여 다차원 range에 대한 search를 구현한다. 이는 각 차원에서 range relation을 평가하는 다차원 range comparator를 구현함으로써 가능해졌다. comparator에서 구현된 공간 relation, 즉 Lucene numeric range query는 INTERSECTS, CONTAINS, WITHIN을 포함한다. 그러면, DISJOINT query는 MUST_NOT 절을 가진 boolean query를 포함한 INTERSECTS query를 사용하면 가능하다. 다중 field의 경우, document는 모든 값이 서로 다를 경우에만, DISJOINT로 처리된다. CROSSES relation은 현재 작업 중이며, 향후 개선 사항으로 계획하고 있다. 다음 그림은 2개의 간단한 1차원 range간의 계산된 relation을 보여준다.
This example follows the convention that an open dot represents a range that does not include that specified value. The pink range represents the target (query) and the turquoise represents an indexed range.
이 예제에서, 열린 점은 특정 값을 포함하지 않는 range를 나타내는 규칙을 가진다. 분홍색 range는 대상(query)를 나타내고, 청색은 index range를 나타낸다.
Give it a try...
We are extremely excited to see the many unique and creative ways that Numeric and Date range indexing and searching is applied to solve your particular use case. As always we encourage feedback, suggestions, and contributions on our Elasticsearch github page and we hope these new field types come in handy for you!
numeric과 date range의 index 및 search가 여러분만의 특정 사용 사례를 해결하기 위해 적용되는 독특하고 창조적인 방법이 된다면 매우 기쁠것이다. 항상 그렇듯이, 우리는 Elasticsearch github page에 여러분의 feedback, 제안, 기고를 환영하며, 새로운 field type이 여러분에게 도움이 되기를 바란다.
And with that, the time is gone, the song is over… Enjoy!
원문 : Numeric and Date Ranges in Elasticsearch: Just Another Brick in the Wall
'Blog' 카테고리의 다른 글
2017.01.25 - 번역 - RED Elasticsearch Cluster? Panic no longer ... (0) | 2019.01.07 |
---|---|
2017.01.16 - 번역 - “Hot-Warm” Architecture in Elasticsearch 5.x ... (0) | 2019.01.07 |
2016.12.14 - 번역 - State of the official Elasticsearch Java clients ... (0) | 2019.01.07 |
2016.11.15 - 번역 - A New Way To Ingest - Part 2 ... (0) | 2019.01.07 |
2016.11.11 - 번역 - Every shard deserves a home ... (0) | 2019.01.07 |