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

本文关键字:TimeSpan 字段 方法 DateTime 搜索 索引 Lucene | 更新日期: 2023-09-27 18:01:47

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

互联网上到处都是:教程引用过时版本的Lucene.NET;手册建议将日期和时间存储为整型、长型和字符串;建议使用NumericRangeQueries的文件;推荐TermRangeQueries的博客文章;GitHub评论说,数字是前进的方向,哦,我的。

为了对所有内存管理和垃圾收集的热爱,让我们为那些开始全文搜索之旅的可怜的灵魂编译一个超全面和超最新的参考:

  1. 在索引日期和时间时,Analyzer应该和不应该使用
  2. 日期和时间应该如何在Document中存储以及应该使用哪些Field类型
  3. 如何对日期 (DateTime值)和时间 (TimeSpan值)进行范围查询
    • …使用标准QueryParser
    • …手动构建Query对象
    • …写自己的QueryParser
  4. 如何为日期 (DateTime值)和时间 (TimeSpan值)做精确匹配
    • …使用标准QueryParser
    • …手动构建Query对象
    • …写自己的QueryParser

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

这不是讨论这类问题的论坛(所以是Q&A)我很乐意在维基上合作……但有些评论可以让你继续。

之所以没有权威性的文章,是因为答案是"看情况"。与通常的查询存储一样,根据您想要查询它的方式,答案将有所不同。

有一件事是肯定的……always convert to UTC

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

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

这使其可读/可写,并启用范围。虽然它确实意味着非范围查询不美观。

同样的方案可以用UN_TOKENIZED或Keyword分析器来处理字符串字段。在这种情况下,您可以编写TokenFilter/Analyzer来解析输入的日期并将其转换为上述标准格式或标准ISO格式,这也是可排序的(以便范围工作)。

其中一些选择将取决于搜索端如何工作…

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

如果它在API后面,这个单独的from/to参数可以手动构造,并使用BooleanQuery或Filter(如果要重用相同的日期/范围,过滤器是好的)与已解析的部分相结合。

所以,你有它…一个没有答案的答案。没有"放之四海而皆准"的方法。可以把它想象成设计一个数据仓库。设计多少取决于您想要创建的查询/报告