我已经实现了一个Lucene.NET(2.9)搜索事件,该事件具有允许我在一个月和一年内传递的查询参数 - 然后它返回在该月内运行的所有事件(即,如果我在2013年12月通过它将匹配12月内某一天发生的任何事件。每个事件都有一个StartDate和一个EndDate参数。
我已经设法使用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已被弃用,似乎NumericRangeQuery
是可行的方法(使用NewIntRange)
,但我不确定如何将现有代码转换为使用我认为我将日期转换为整数并使用它,但不确定最小和最大边界是如何工作的[因为作为一个值类型,min和max都必须有一个值]。
我的所有尝试似乎都导致没有退回任何物品。例如,这是一个例子:
var lowerNumericRange = NumericRangeQuery.NewIntRange("StartDate", 0, Convert.ToInt32(upperDate), true, true);
var upperNumericRange = NumericRangeQuery.NewIntRange("EndDate", Convert.ToInt32(lowerDate), 0, true, true);
任何线索?
答案 0 :(得分:4)
无需切换到数字查询。您正在正确生成字符串日期表示,只需切换到TermRangeQuery
即可。
var lowerRange = new TermRangeQuery("StartDate", null, upperDate, true, true);
var upperRange = new TermRangeQuery("EndDate", lowerDate, null, true, true);
答案 1 :(得分:1)
我认为您最好使用ToOADate(),但最初需要以此格式存储。您还需要将其转换为int,因为它还包含小数部分中的时间。
var lowerNumericRange = NumericRangeQuery.NewIntRange("StartDate", 0, Convert.ToInt32(upperDate.ToOADate()), true, true);
var upperNumericRange = NumericRangeQuery.NewIntRange("EndDate", Convert.ToInt32(lowerDate.ToOADate()), 0, true, true);