Lucene.NET:推荐的索引和搜索DateTime和TimeSpan字段的方法

时间:2016-08-10 11:24:42

标签: c# datetime lucene.net timespan

看似基本的任务:索引DateTimeTimeSpan字段,稍后对它们进行范围和精确搜索。

互联网遍布各地:教程引用过时的Lucene.NET版本;手册建议将日期和时间存储为整数,长度为字符串;使用NumericRangeQueries建议的文件;推荐TermRangeQueries的博客文章; GitHub评论说数字是要走的路,哦,我的。

对于所有内存管理和垃圾收集的爱,让我们为那些踏上全文搜索之旅的穷人编写一份超全面且超级最新的参考资料:

  1. 索引日期和时间时Analyzer应该是什么,
  2. 如何将日期和时间存储在Document中以及应使用哪些Field类型
  3. 如何为日期DateTime值)和TimeSpan值)执行范围查询
    • ...使用标准QueryParser
    • ...手动构建Query个对象时
    • ...在编写自己的QueryParser
  4. 如何为日期DateTime值)和TimeSpan值)完全匹配
    • ...使用标准QueryParser
    • ...手动构建Query个对象时
    • ...在编写自己的QueryParser

1 个答案:

答案 0 :(得分:1)

不是这种讨论的论坛(SO适用于Q& A)。我很乐意在wiki上合作......但是有些评论可以帮助你。

没有任何权威性文章的原因是答案是“它取决于”。与查询存储一样,答案将根据您的查询方式而有所不同。

有一件事是肯定的...... 总是转换为UTC

我通常喜欢使用数字字段。将日期转换为语义数字。所以2016年8月10日= 20160810。日期时间只是扩展到添加HH,MM和SS。一些实用功能使这很简单。

我有一个系统,可以定义每个字段的“精度”。

这使得人类可读/写并启用范围。虽然它确实意味着非范围查询并不漂亮。

相同的方案可以与UN_TOKENIZED的字符串字段或关键字分析器一起使用。在这种情况下,您可以编写TokenFilter / Analyzer来解析输入的日期并转换为上面的标准格式或标准ISO格式,这也是可排序的(这样范围可以工作)。

其中一些选择将取决于搜索方面的工作方式......

如果需要将查询解析为字符串,则Lucene QueryParser有一点限制。我有自己的解析器(基于Irony.net)。

如果它位于API之后,则可以手动构建from / to那个部分的单独参数,并使用BooleanQuery或Filter与解析部分组合(如果将重用相同的日期/范围,则过滤器很好)。 / p>

所以,你有它......一个非答案的答案。没有“一刀切”。想想它有点像设计DataWarehouse。设计在某种程度上取决于您要创建的查询/报告