2009-03-31 4 views
3

나는 생년월일을 저장하는 색인을 가지고 있으며, 생년월일이 특정 월/일의 X 일 이내 인 사람을 찾고 싶습니다. 예를 들어, 나는 태어난 연도에 관계없이 누군가의 생일이 특정 일 수 이내에 오르고 있는지 알고 싶습니다. Solr을 사용하여이 쿼리를 어떻게 수행합니까? ("생년월일"필드에서)Solr에서 생일 (생일이 아님) 검색을하는 방법?

후속 조치로이 쿼리가 자주 실행된다고 가정 할 때 생년월일이 아닌 다른 인덱스를 사용해야합니까? 단지 월 - 일 쌍과 같은? 쿼리와 인덱싱의 관점에서 가장 효율적인 방법은 무엇입니까?

답변

2

당신은 Solr이 Lucene을 사용한다는 것을 기억해야합니다. 지금은 모든 것이 저장되고 문자열로 색인화됩니다.

범위 쿼리 날짜는 일반적으로 내부적으로 만 쉽게 검색 될 MMDD 문자열을 저장하는 인덱스에서 별도의 필드를 갖는 YYYYMMDD

로 인덱싱되기 때문에 작동하지 않습니다 때문이다.또는 추가 필드가 필요 없으며 날짜를 다르게 인덱싱하려는 경우 인덱싱 할 때 순서를 재정렬하여 생년월일을 인덱싱 할 수 있습니다. MMDDYYY

그러면 일치해야하는 항목이 모두 포함되어 있으므로 범위 쿼리를 구성 할 수 있습니다. 하여 문자열의 앞, 그리고 루씬은 lexiographically 일치

(BA가이던 rangequery -> BC가 일치합니다 방망이, 야구,하지만 때문이다.)

이 같은

인덱싱은 일회성 고정 비용이며, 파괴 나던 내부 배열 이외의 다른 것들. 그게 문제라면, 디스크 공간이 싼 두 개의 필드를 사용하십시오!)

+0

좋습니다. 감사합니다. 수치스러운 일이지만 생년월일 필드에서 직접 검색하는 방법은 아무도 없습니다. "BirthdayField"라는 자체 FieldType을 IntField처럼 인덱스를 추가하는 데 골머리를 앓 았지만 DateField처럼 쿼리했습니다. .. Lotsa work. –

+0

아마도이 필드에서 직접 검색 할 수는 있지만 효율적이지는 않습니다. 사실로 인해 추가 로직이 많이 필요하고 단일 쿼리에서 완전한 대답을 얻을 수 없습니다. – Max

+0

예, "직접이 분야에 관한"질문이었습니다. 나는 정말로 대답하고 싶었습니다. 대신에 모든 사람들이 제가 물었던 "follow-up"질문에 대한 답을 제공했습니다. 그리고 나는 (당신이 제안한 것의 라인을 따라) 후속 조치를위한 해결책을 이미 가지고있었습니다. –

2

일/월 쌍이 까다 롭다면 (나도 모르겠는지 모르겠다.) "1980 년 생년월일"필드가없는 이유는 무엇입니까? (생존했는지 여부). 그럼 당신은 1980 년에 대한 검색을 할 필요가 있습니다. 이것은 일/월 페어가 실제로이지만 쉽게 사용할 수있는 유형으로 저장됩니다.

1980 년이 윤년이기 때문에 내가 선택한 이유입니다. 그렇지 않으면 2 월 29 일의 생일을 가진 사람들이 표현하기 어려울 수 있습니다.

또는 정수의 형태로 "일/월"쌍 :

(100 * month) + day 

는 당신에게 검색 및 인덱스하기 쉬운 것입니다 간단한 표현을 제공한다. 나는 보통 하나의 필드에 데이터를 저장하는 것이 두 개의 필드를 사용하는 것보다 간단하다는 것을 발견했다. 그럼 다시, 나는 Solr을 사용한 적이 없다. ...

EDIT : 나는 또 다른 생각을 가지고있다. 조금 상쾌하지만 ... 심지어

의 출생을 효과적으로 월, 일, 년 형식으로 저장하십시오. 나는 이것은 당신이 출생을 저장하는 데 필요하지 않은 가정한다 (SOLR는 MM/DD/YYYY 형식으로 그것을 쉽게 할 수 있는지 알고 다음 사전 식 순서로 검색을 수행하지만, 대안은

(100000 * month) + (1000 * dayOfMonth) + (year - 1900) 

하지 않습니다 1900 년 이전의 날짜입니다.

원래 생년월일은 복구 할 수 있지만 주문은 생일 순서대로 진행되며 가장 오래된 사람이 특정 날짜에 먼저 표시됩니다.

사람들을 실제로는 나이으로 분류하는 것은 어렵다는 것을 의미합니다. 그게 너에게 문제가되는지 나는 모른다. 내가 말했듯이

어쨌든, 조금 오프 - 더 - 벽,하지만 그런 다음 그 값을 검색 :

+0

일/월 쌍은 까다로운 것이 아니라 모든 레코드에 대해 "스키마의 또 다른 필드"를 의미합니다. 이것이 내가 피하려고하는 것입니다. 특정 연도의 생일 날짜를 설정하는 것은 월/일 쌍과 거의 동일하지만 일정한 연도 ("연도 없음"대신)가 있습니다. –

0

당신은 1 366까지 숫자로 생일을 저장할 수 도움이 될 수 있습니다. 장점은 일별 범위에서 아주 쉽게 검색 할 수 있다는 것입니다. 단점은이 달이 생일 인 사람을 찾는 데이 필드를 쉽게 사용할 수 없다는 것입니다.

관련 문제