以下过滤器查询返回零结果(使用*:*作为查询):
-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])
不知何故,它奏效了。我仍然很好奇为什么会有所作为。希望有人能说清楚。
谢谢!
答案 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
的文档。