繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM