这个Solr范围过滤器查询有什么问题?

时间:2013-06-20 19:04:30

标签: search solr solr-query-syntax

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

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

但如果我只过滤:

-startDate:[* TO *]

我得到3个结果。

如果我只按以下方式过滤:

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

我得到161个结果。

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

修改

我正在使用Solr 4.2.1.2013.03.26.08.26.55

修改

嗯,奇怪的是,一位同事建议将括号括在这两个部分:

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

不知何故,它奏效了。我仍然很好奇为什么会有所作为。希望有人能说清楚。

谢谢!

4 个答案:

答案 0 :(得分:6)

Solr支持纯负面查询。他们这样做,基本上是通过将纯粹的否定扩展到类似的东西:

*:* -startDate:[* TO *]

但是,你把它结合在一个BooleanQuery中,我不相信它再适用这种逻辑。在lucene中,否定查询不会提取任何内容,而是过滤掉其他正面查询字词带来的匹配。这与SQL查询不同,SQL查询在某种意义上以隐式*:*或完整的结果表开始,并允许您将其削减。

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

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


如果需要搜索unset / null值,更好的想法是存储默认值。 *:*并且通过扩展,像这样的纯负面查询必须扫描整个索引,因此执行效果非常差。提供默认值将提高性能,并防止出现这种令人困惑的情况。

答案 1 :(得分:0)

我使用femtoRgon's answer并且能够构建包含范围和空值的查询。

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

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

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

答案 2 :(得分:-1)

纯粹的否定查询不起作用,因为它们忽略了任何结果。

尝试:

AND -startDate:[* TO *]

答案 3 :(得分:-1)

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

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

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