[英]What's wrong with this Solr range filter query?
以下过滤器查询返回零结果(使用*:*作为查询):
-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])
不知怎的,它奏效了。 我仍然很好奇为什么会有所作为。 希望有人可以解释一下。
谢谢!
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值,更好的想法是存储默认值。 *:*
并且通过扩展,像这样的纯负面查询必须扫描整个索引,因此执行效果非常差。 提供默认值将提高性能,并防止出现这种令人困惑的情况。
我使用了femtoRgon的答案,并且能够构建包含范围和空值的查询。
以下内容包括2014年1月1日或之后具有StartDate的所有文档以及没有StartDate的所有文档。
(StartDate:[2014-01-01T00:00:00Z TO *]) OR (-StartDate:([* TO *]) AND *:*)
神奇的是(-StartDate:([* TO *]) AND *:*)
。 这将选择没有StartDate的文档。
纯粹的否定查询不起作用,因为它们忽略了任何结果。
尝试:
: AND -startDate:[* TO *]
当您使用-startDate:[* TO *]
查询时,您将获得没有startDate
字段的任何数据的文档。
当您查询startDate:[* TO NOW/DAY+1DAY]
您将获得startDate
字段中值小于或等于NOW/DAY+1DAY
。
您可以尝试-startDate:* OR startDate:[* TO NOW/DAY+1DAY]
。 第一部分表示没有值的文档,第二部分表示在startDate
字段中值小于或等于NOW/DAY+1DAY
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.