2.X/2. Search in Depth

2-1-4. Ranges

drscg 2017. 9. 30. 02:19

When dealing with numbers in this chapter, we have so far searched for only exact numbers. In practice, filtering on ranges is often more useful. For example, you might want to find all products with a price greater than $20 and less than $40.

이 장에서 number를 다룰 때, 지금까지는 정확한 수만을 검색했었다. 실제로는, 범위를 filtering하는 것이 때때로 더 유용하다. 예를 들어, 가격이 $20보다 크고 $40보다 작은 모든 상품을 찾아보자.

In SQL terms, a range can be expressed as follows:

SQL에서, range는 아래와 같이 표현된다.

SELECT document
FROM   products
WHERE  price BETWEEN 20 AND 40

Elasticsearch has a range query, which, unsurprisingly, can be used to find documents falling inside a range:

Elasticsearch도 당연히 어떤 범위에 포함되는 document를 찾을 수 있는, range query를 가지고 있다.

"range" : {
    "price" : {
        "gt" : 20,
        "lt" : 40
    }
}

The range query supports both inclusive and exclusive ranges, through combinations of the following options:

range query는 아래 옵션의 조합을 통해, 포함하거나 제외하는 range를 모두 지원한다.

  • gt> greater than ~보다 큰
  • lt< less than ~보다 작은
  • gte>= greater than or equal to ~보다 크거나 같은
  • lte<= less than or equal to ~보다 작거나 같은

Here is an example range query:

아래에 range filter의 예가 있다.

GET /my_store/products/_search
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "range" : {
                    "price" : {
                        "gte" : 20,
                        "lt"  : 40
                    }
                }
            }
        }
    }
}

If you need an unbounded range (for example, just >20), omit one of the boundaries:

무한 범위(예를 들어, 단순히 20 보다 큰)가 필요하다면, 경계 중 하나를 생략하면 된다.

"range" : {
    "price" : {
        "gt" : 20
    }
}

Ranges on Datesedit

The range query can be used on date fields too:

range query는 date field에서도 사용할 수 있다.

"range" : {
    "timestamp" : {
        "gt" : "2014-01-01 00:00:00",
        "lt" : "2014-01-07 00:00:00"
    }
}

When used on date fields, the range query supports date math operations. For example, if we want to find all documents that have a timestamp sometime in the last hour:

date field에서 사용할 경우, range query는 날짜의 수학적인(date math) 연산을 지원한다. 예를 들어, 최근 1시간 동안의 timestamp를 가진, 모든 document를 찾기를 원한다면

"range" : {
    "timestamp" : {
        "gt" : "now-1h"
    }
}

This filter will now constantly find all documents with a timestamp greater than the current time minus 1 hour, making the filter a sliding window across your documents.

이제 이 filter는, 문서 전체에 대해 filter를 움직이는 창(sliding window) 으로 만들어, 항상 현재 시간에서 1시간을 뺀 시간보다 큰 timestamp를 가진 모든 document를 찾을 것이다.

Date math can also be applied to actual dates, rather than a placeholder like now. Just add a double pipe (||) after the date and follow it with a date math expression:

date 연산은 또한 now 같은 기호 외에, 실제 날짜에도 적용된다. 날짜 다음에 ||(double pipe)를 추가해, 아래처럼 date 연산을 표현할 수 있다.

"range" : {
    "timestamp" : {
        "gt" : "2014-01-01 00:00:00",
        "lt" : "2014-01-01 00:00:00||+1M" 
    }
}

Less than January 1, 2014 plus one month

Date math is calendar aware, so it knows the number of days in each month, days in a year, and so forth. More details about working with dates can be found in the date format reference documentation.

date math은 달력 기준(calendar aware) 이다. 따라서 각 달의 날짜 수, 해당하는 해의 날짜 수 등을 알고 있다. date가 동작하는 방식에 대한 자세한 사항은 date format reference documentation 을 참고하자.

Ranges on Stringsedit

The range query can also operate on string fields. String ranges are calculated lexicographically or alphabetically. For example, these values are sorted in lexicographic order:

range query는 또한 string field를 연산할 수 있다. string range는 사전(lexicographically) 상의 순서나 ABC순으로 계산된다. 예를 들면, 아래 값들은 사전상의 순서로 정렬되어 있다.

  • 5, 50, 6, B, C, a, ab, abb, abc, b
Note

Terms in the inverted index are sorted in lexicographical order, which is why string ranges use this order.

string range가 이 순서로 정렬되는 이유는, inverted index에서 단어는 사전상의 순서로 정렬되기 때문이다.

If we want a range from a up to but not including b, we can use the same range query syntax:

a 에서 b 를 포함하지 않는 범위를 원한다면, 동일한 range query 문법을 사용할 수 있다.

"range" : {
    "title" : {
        "gte" : "a",
        "lt" :  "b"
    }
}


'2.X > 2. Search in Depth' 카테고리의 다른 글

2-1-2. Combining Filters  (0) 2017.09.30
2-1-3. Finding Multiple Exact Values  (0) 2017.09.30
2-1-5. Dealing with Null Values  (0) 2017.09.30
2-1-6. All About Caching  (0) 2017.09.30
2-2. Full-Text Search  (0) 2017.09.30