6

以下过滤器查询返回零个结果(使用 *:* 作为查询):

-startDate:[* TO *] OR startDate:[* TO NOW/DAY+1DAY]

但如果我只过滤:

-startDate:[* TO *]

我得到 3 个结果。

如果我只过滤:

startDate:[* TO NOW/DAY+1DAY]

我得到 161 个结果。

为什么组合 FQ 返回零结果?我想要的是过滤器返回开始日期为空或开始日期早于今天的任何文档。

编辑:

我正在使用 Solr 4.2.1.2013.03.26.08.26.55

编辑:

好吧,听起来很奇怪,一位同事建议将括号放在两个部分上,如下所示:

(-startDate:[* TO *]) OR (startDate:[* TO NOW/DAY+1DAY])

不知何故,它奏效了。我仍然很好奇为什么会有所作为。希望有人可以阐明。

谢谢!

4

4 回答 4

6

Solr 支持纯否定查询。他们基本上是通过将纯粹的否定扩展到以下内容来做到这一点的:

*:* -startDate:[* TO *]

但是,您将它组合在 BooleanQuery 中,我认为它不再适用这种逻辑。在 lucene 中,否定查询不会获取任何内容,而是过滤掉由其他肯定查询项带来的匹配项。这与 SQL 查询不同,后者在某种意义上以隐式*:*或完整的结果表开始,并允许您削减它。

我相信您OR实际上被忽略了,因为严格来说,它在上下文中没有意义。一般来说,OR只是语法糖,我相信(field:this OR field:that相当于field:this field:that)。

因此,实际上您的查询是: startDate:[* TO NOW/DAY+1DAY] -startDate:[* TO *],这使您看到的结果更加明显。当您将其包装在括号中时,每个术语查询将被单独处理,并且您可以访问对solr孤独否定查询的支持。


如果您需要搜索未设置/空值,一个更好的主意是存储默认值。*:*并且通过扩展,像这样的纯否定查询必须扫描整个索引,因此性能很差。提供默认值将提高性能,并防止出现这种令人困惑的情况。

于 2013-06-20T23:32:31.973 回答
0

我使用了 femtoRgon 的答案,并且能够构建一个包含范围和空白值的查询。

以下内容包括 StartDate 为 2014 年 1 月 1 日或之后的所有文档以及所有没有 StartDate 的文档。

(StartDate:[2014-01-01T00:00:00Z TO *]) OR (-StartDate:([* TO *]) AND *:*)

神奇的是(-StartDate:([* TO *]) AND *:*)。这将选择没有 StartDate 的文档。

于 2014-05-09T13:52:14.163 回答
-1

纯否定查询是行不通的,因为它们会从无到有地忽略结果。

尝试:

: AND -startDate:[* TO *]

于 2013-06-20T19:08:27.793 回答
-1

当您查询时,-startDate:[* TO *]您会得到没有该startDate字段任何数据的文档。

当您查询时,startDate:[* TO NOW/DAY+1DAY]您会得到字段中值小于或等于的NOW/DAY+1DAY文档startDate

你可以试试-startDate:* OR startDate:[* TO NOW/DAY+1DAY]。第一部分表示没有值的文档,第二部分表示NOW/DAY+1DAYstartDate字段中值小于或等于的文档。

于 2013-06-20T19:08:47.730 回答