如何将 Lucene.NET 范围查询转换为用于日期范围搜索的数字范围查询

本文关键字:范围 查询 日期 用于 搜索 数字 转换 Lucene NET | 更新日期: 2023-09-27 18:37:11

我已经实现了一个 Lucene.NET(2.9)搜索事件,该事件具有一个查询参数,允许我在一个月和一年内传递 - 然后它返回该月内运行的所有事件(即,如果我在2013年12月通过,它将匹配在12月的某一天运行的任何事件)。每个事件都有一个开始日期和一个结束日期参数。

我已经设法使用带有如下代码的 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);

有什么线索吗?

如何将 Lucene.NET 范围查询转换为用于日期范围搜索的数字范围查询

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

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

我认为你最好使用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);