我正在将我们的系统从 Solr 4.1.0 更新到 Solr 8.1.4。 (是的,我知道这不是可用的最新版本,但这是我们系统批准的版本)。
我们会定期提交查询以查找“重叠”时间范围的文档。假设我们有索引字段 "starttime_date" 和 "endtime_date"。以防万一,这些字段在 Solr 4.1.0 中被索引为 TrieDateField 类型,而在 Solr 8.1.4 中这些字段是 DatePointField 类型。
这些“查找重叠文档”查询的一部分是包括任何还没有 endtime_date 值的文档。因此,查询将如下所示:
(starttime_date:[* TO 2021-02-19T17:00:00.000Z] AND (endtime_date:[2021-02-19T15:00:00.000Z] OR (*:* NOT endtime_date:*)))
这应该找到在 02/19/2021 17:00Z 之前开始的所有文档,并且没有结束,或者在 02/19/2021 15:00Z 之前结束。我把它用括号括起来,因为这组子句几乎总是与其他子句“与”。对于这个问题,其他条款不是我关心的。
此解决方案是基于对类似问题的回答而构建的:https://stackoverflow.com/a/28859224/3586783
此解决方案适用于 Solr 4.1.0,但似乎不适用于 Solr 8.1.4。一旦我添加了 OR (*:* NOT endtime_date:*)
子句,它似乎匹配所有文档。我曾尝试使用 -endtime_date:*
、-endtime_date:[* TO *]
、!endtime_date:*
、!endtime_date:[* TO *]
,但这些都没有奏效。
这是否与字段类型(TrieDateField 到 DatePointField)的变化有关?我们的查询语法没有改变,但现在 Solr 处理查询的方式似乎有所不同。
如果需要更多信息来理解问题,请告诉我。