2013-10-29 2 views
4

저는 한 달과 한 해에 전달할 수있는 쿼리 매개 변수가있는 이벤트에 대해 Lucene.NET (2.9) 검색을 구현했습니다. 그런 다음 그 달에 실행되는 모든 이벤트를 반환합니다 (즉, 통과하면 2013 년 12 월에는 12 월 중에 하루 동안 진행되는 모든 이벤트와 일치합니다.) 각 이벤트에는 StartDate 및 EndDate 매개 변수가 있습니다.날짜 범위 검색을 위해 Lucene.NET RangeQuery를 NumericRangeQuery로 변환하는 방법은 무엇입니까?

나는이 같은 코드 뭔가가있는 RangeQuery를 사용하여이 작업 얻을 관리했습니다 :

Lucene.Net.Search.BooleanQuery bq = new Lucene.Net.Search.BooleanQuery(); 

DateTime lowerBoundDate = new DateTime(search.Year.Value, search.Month.Value, 1).Date; 
DateTime upperBoundDate = new DateTime(search.Year.Value, search.Month.Value, DateTime.DaysInMonth(search.Year.Value, search.Month.Value)).Date; 

string lowerDate = DateTools.DateToString(lowerBoundDate, DateTools.Resolution.DAY); 
string upperDate = DateTools.DateToString(upperBoundDate, DateTools.Resolution.DAY); 

// lowerDate would be first day of month, upperDate would be last day of month 

var lowerRange = new RangeQuery(null, new Term("StartDate", upperDate), true); 
var upperRange = new RangeQuery(new Term("EndDate", lowerDate), null, true); 

var query = new BooleanQuery(); 

query.Add(new BooleanClause(lowerRange, BooleanClause.Occur.MUST)); 
query.Add(new BooleanClause(upperRange, BooleanClause.Occur.MUST)); 

bq.Add(query, Lucene.Net.Search.BooleanClause.Occur.MUST); 

그러나, 나는 알고있다 RangeQuery가 사용되지 않습니다 및 NumericRangeQueryNewIntRange)를 사용하여 이동하는 방법이 (처럼 보인다, 하지만 난 어떻게 내 기존 코드를 변환하는 방법에 대한 확실하지 않아요 그것으로 작업 할 수 있습니다. 나는 정수로 날짜를 변환하고 그것을 사용하지만, 분 및 최대 경계가 작동하는 방법을 잘 모르겠다 [value type both min 최대 값에는 값이 있어야합니다.]

내 모든 시도는 항목이 반환되지 않는 것으로 보입니다. 자세는 다음과 같습니다.

var lowerNumericRange = NumericRangeQuery.NewIntRange("StartDate", 0, Convert.ToInt32(upperDate), true, true); 
var upperNumericRange = NumericRangeQuery.NewIntRange("EndDate", Convert.ToInt32(lowerDate), 0, true, true); 

실마리가 있습니까?

답변

4

숫자 쿼리로 전환 할 필요가 없습니다. 문자열 날짜 표현을 정확하게 생성하고 있습니다. TermRangeQuery으로 전환하십시오.

var lowerRange = new TermRangeQuery("StartDate", null, upperDate, true, true); 
var upperRange = new TermRangeQuery("EndDate", lowerDate, null, true, true); 
+0

감사합니다, 이것 역시 제가 온 결론입니다! –

1

나는 ToOADate()을 사용하는 것이 가장 좋다고 생각하지만 원래이 형식으로 저장해야합니다. 또한 그것도 정수로 변환해야합니다 그것은 정수 부분으로 시간을 포함하고 있습니다.

var lowerNumericRange = NumericRangeQuery.NewIntRange("StartDate", 0, Convert.ToInt32(upperDate.ToOADate()), true, true); 
var upperNumericRange = NumericRangeQuery.NewIntRange("EndDate", Convert.ToInt32(lowerDate.ToOADate()), 0, true, true); 
+0

감사합니다. 아마도 TermRangeQuery를 사용 하겠지만 어쨌든 알고있는 것이 좋습니다. –