날짜 다루기
날짜 서식
Solr의 TrieDateField(와 곧 사라질 DateField)는 밀리초 단위의 시점을 나타냅니다. 사용되는 형태는 XML 스키마 사양에 있는 dateTime의 정규 표현 형식으로 제한됩니다:
YYYY-MM-DDThh:mm:ssZ
- YYYY는 연도입니다.
- MM은 월입니다.
- DD는 날짜입니다.
- hh는 24시간 단위로 표현된 시간입니다.
- mm은 분입니다.
- ss는 초입니다.
- Z는 'Z' 문자를 그대로 쓰며, 이 문자열이 UTC로 된 날짜를 나타냄을 알려줍니다.
시간대는 명시하지 않을 수 있습니다. 날짜 문자열은 항상 협정 세계시(UTC)로 표현됩니다. 다음은 예제 값입니다:
1972-05-20T17:33:18Z
만약 원한다면 선택적으로 세밀한 초 단위도 포함할 수 있습니다. 물론 밀리초 이후의 단위는 무시됩니다. 세밀한 초 단위가 포함된 값의 예제입니다:
- 1972-05-20T17:33:18.772Z
- 1972-05-20T17:33:18.77Z
- 1972-05-20T17:33:18.7Z
ⓘ
이스케이핑이 필요할 수 있음
보다시피, 날짜 서식에서 시, 분, 초를 구분할 때 콜론 문자(:)가 포함됩니다. 콜론 문자(:)는 Solr의 대부분의 공동 질의 분석기에게 특별한 용도로 이용되는 문자이기 때문에, 수행하려는 작업에 따라서 종종 이스케이핑이 필요합니다.
다음은 일반적인 올바르지 않은 질의입니다:
datefield:1972-05-20T17:33:18.772Z
다음은 올바른 질의입니다:
datefield:1972-05-20T17\:33\:18.772Z
datefield:"1972-05-20T17:33:18.772Z"
datefield:[1972-05-20T17:33:18.772 TO *]
날짜 범위 서식
Solr의 DateRangeField는 위에 설명된 (또한 아래 날짜 계산에 설명된) 날짜 표현 문법을 동일하게 지원합니다. 그리고 날짜 범위를 표현하기 위한 추가적인 방법도 지원합니다. 하나를 예로 들어보자면 일부만 표현하는 날짜입니다. 표현된 단위의 전체 날짜를 나타내죠. 다른 하나는 범위 문법([ TO ])의 사용입니다. 다음은 몇 가지 예제입니다:
- 2000-11 – 2000년 11월의 전체 날짜
- 2000-11T13 – 2000년 11월의 전체 날짜 중 13시 (오후 1시~오후2시)
- -0009 – 기원전 10년. 연도의 0을 표시하면 서기 0년과 기원전 1년을 나타냅니다.
- [2000-11-01 TO 2014-12-01] – 날짜 단위의 날짜 범위.
- [2014 TO 2014-12-01] – 2014년 시작일부터 12월 1일의 끝까지.
- [* TO 2014-12-01] – 표현할 수 있는 가장 첫 순간부터 2014년 12월 1일의 끝까지.
제한사항: 범위 표현 문법은 포함된 날짜 계산을 지원하지 않습니다. 만약 NOW/DAY와 같이 TrieDateField와 일부만 표현하는 날짜에서 지원되는 날짜 인스턴스를 명시한다면, 해당 날짜 전체 범위가 아니라 첫 밀리초를 얻을겁니다. 배타적 연산자({과 })는 질의문에서 작동하지만 색인 범위에서는 작동하지 않습니다.
날짜 계산
Solr의 날짜 Field Type은 날짜 계산 표현식을 지원합니다. 고정된 순간에 대한 상대적인 시간을 손쉽게 만들 수 있죠. 현재 시간은 특수 값 "NOW"를 이용해서 나타낼 수도 있습니다.
날짜 계산 문법
날짜 계산 표현식은 시간을 특정 단위로 추가하거나, 현재 시간을 특정 단위로 반올림해서 표현할 수 있습니다. 표현식은 연결해서 사용할 수 있고, 왼쪽에서 오른쪽 순서로 계산합니다.
예를 들어서 아래 식은 지금으로부터 두 달 후 시점을 나타냅니다:
NOW+2MONTHS
아래는 어제를 나타내죠:
NOW-1DAY
슬래시(/)는 내림을 나타냅니다. 다음 예제는 현재 시간 단위의 첫 순간을 나타냅니다:
NOW/HOUR
아래 예제는 현재로부터 6개월하고도 3일 후 시점의 날짜 단위의 첫 순간을 밀리초 단위로 계산하는 예제입니다.
NOW+6MONTHS+3DAYS/DAY
날짜 계산은 일반적으로 NOW에 대해 이루어지지만, 임의에 고정 시점에 대해서도 적용할 수 있습니다:
1972-05-20T17:33:18.772Z+6MONTHS+3DAYS/DAY
날짜 계산에 영향을 끼치는 요청 파라미터
NOW
NOW 파라미터는 여러 노드에 걸친 분산된 요청에 대해 일관된 날짜 계산 표현식을 보장하기 위해 Solr에 의해 내부에서 사용됩니다. 하지만 Solr에게 임의의 순간(과거나 미래)을 사용하도록 특수 값 "NOW"를 지정할 수 있습니다. 특수 값 "NOW"가 날짜 계산 표현식에 영향을 끼치는 모든 상황에 대해 오버라이드 할 수 있죠.
반드시 밀리초 단위로 표기해야 합니다.
예제:
q=solr&fq=start_date:[* TO NOW]&NOW=1384387200000
TZ
기본적으로 모든 시간 계산 표현식은 UTC 시간대로 계산되지만, TZ 파라미터는 모든 시간 기반 추가 작업을 강제로 지정된 시간대로 변환함으로써 이 동작을 오버라이드 할 수 있습니다.
예를 들어서, 다음 요청은 현재 달에 대해서 UTC 시간대의 "하루 단위"의 패싯으로 패시팅 할 것입니다.
http://localhost:8983/solr/my_collection/select?q=*:*&facet.range=my_date_field&facet=true&facet.range.start=NOW/MONTH&facet.range.end=NOW/MONTH%2B1MONTH&facet.range.gap=%2B1DAY
0 0 0 0 0 0 0 ...
이 예제에서는, "날짜들"은 지정된 시간대로 계산될 것입니다. 가능하다면 일광 절약 시간도 적용할 것입니다.
http://localhost:8983/solr/my_collection/select?q=*:*&facet.range=my_date_field&facet=true&facet.range.start=NOW/MONTH&facet.range.end=NOW/MONTH%2B1MONTH&facet.range.gap=%2B1DAY&TZ=America/Los_Angeles
0 0 0 0 0 0 0 ...
DateRangeField에 대한 더 자세한 내용
TrieDateField가 사용된 대부분의 장소는 DateRangeField로 드롭인 교체가 가능합니다. 유일한 차이점은 Solr의 XML이나 SolrJ 응답형식이 저장된 데이터를 날짜 대신 문자열로 보여주는 것입니다. 이 Field의 기본 색인 데이터는 약간 커집니다. 초 단위로 정렬하는 질의는 TrieDateField에 비해 빨라집니다. 특히 UTC 시간대라면 더 빨라집니다. 하지만 DateRangeField의 메인 포인트는 이름에서 알 수 있듯이 날짜 범위 색인을 허용하는 것입니다. 그러기 위해서는, 간단하게 아래 보이는 형식의 문자열을 제공하면 됩니다. 색인된 데이터와 질의 범위 사이의 관계에 대한 서술어 3가지를 지정하는걸 지원합니다: Intersects (기본값), Contains, Within. 다음과 같이 op 로컬 파라미터를 이용해서 질의함으로써 지정할 수 있습니다:
fq={!field f=dateRange op=Contains}[2013 TO 2018]
위 예제에서는 색인된 기간이 2013년부터 2018년까지의 범위를 포함되는 (혹은 일치하는) 문서를 찾을 것입니다. 색인된 기간이 다중값으로 중첩되는 문서의 기간은 효율적으로 병합됩니다.
DateRangeField의 사용 예제와 기타 정보를 확인하기 위해서는, Solr 커뮤니티 위키를 확인하세요.
Enum Field 다루기 > |
오탈자와 오역은 댓글을 달아주세요. (Apache Solr 5.5 가이드 번역에 관하여...)