dth*_*her 3 lucene lucene.net date range
在我的Lucene.Net索引中,我有一个带有startDate字段和endDate字段的文档.两个字段都以yyyyMMdd格式存储日期.如果今天的日期介于这两个日期之间,我如何构建一个将返回命中的查询?
startDateFieldValue <myTargetDate <endDateFieldValue
例如,如果myTargetDate是17760604,我想要获得一个文档,其startDate字段值为10660101,endDate字段值为19990101.
场景是我有一个Lucene数据库,其中包含代表特定建筑工地的Lucene文档.每个站点都有一个StartConstruction日期和一个EndConstruction日期.我的用户将输入特定日期,我想查找该日期当前正在建设的所有房产.
注意:我正在使用Lucene.Net 1.9,这是一个更旧的版本,而我的公司还无法升级(还).
您可以使用范围查询执行此操作.具体来说,您可以使用a来完成此操作NumericRangeQuery.为此,首先使用NumericField索引日期并将其添加到文档中,如:
var df = new NumericField(Fields.AmendedDate);
df.SetIntValue(int.Parse(itemToIndex.startDate.ToString("yyyyMMdd")));
doc.Add(df);
Run Code Online (Sandbox Code Playgroud)
您可以通过在许多文档中重复使用NumericField来使索引更快一些,请参阅文档.随着您的日期都很好地编入索引,您现在可以搜索它了.为此,我们使用NumericRangeQuery:
var q = NumericRangeQuery.NewIntRange( Fields.AmendedDate,
int.Parse(SearchFrom.ToString("yyyyMMdd")),
int.Parse(SearchTo.ToString("yyyyMMdd")),
true, true);
Run Code Online (Sandbox Code Playgroud)
然后,此查询可用于搜索或连接到现有查询,如:
masterQuery.Add(q, BooleanClause.Occur.MUST);
Run Code Online (Sandbox Code Playgroud)
由于数字字段的索引性质,以这种方式拆分搜索比使用文本术语搜索要快得多.此外,您的分辨率(在这种情况下,以天级)可以改变,以使在你的数据更好的传播(也就是说,如果你需要的小时,分钟和秒,随后他们最字符串添加到最显著).最后一点是,通过使用查询,您可以忽略搜索的过滤步骤(这是普通查询,而不是过滤器).