4

我已经实现了一个 Lucene.NET (2.9) 搜索具有允许我在一个月和一年内传递的查询参数的事件 - 然后它返回在该月内运行的所有事件(即,如果我在 12 月通过2013 它将匹配在 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),但我不确定如何将现有代码转换为使用它。我想我将日期转换为整数并使用那个,但不确定最小和最大界限是如何工作的[因为作为一个值类型,最小值和最大值都必须有一个值]。

我所有的尝试似乎都没有退回任何物品。例如,这里有一个例子:

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

有什么线索吗?

4

2 回答 2

4

无需切换到数字查询。您正在正确生成字符串日期表示,只需切换到TermRangeQuery.

var lowerRange = new TermRangeQuery("StartDate", null, upperDate, true, true);
var upperRange = new TermRangeQuery("EndDate", lowerDate, null, true, true);
于 2013-10-29T16:02:22.693 回答
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);
于 2013-10-29T13:56:35.783 回答