【问题标题】:What's wrong with this Solr range filter query?这个 Solr 范围过滤器查询有什么问题?
【发布时间】:2013-06-17 18:54:21
【问题描述】:

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

-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])

不知何故,它奏效了。我仍然很好奇为什么会有所作为。希望有人能解释一下。

谢谢!

【问题讨论】:

标签: search solr solr-query-syntax


【解决方案1】:

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

试试:

: AND -startDate:[* TO *]

【讨论】:

  • 请注意,我正在尝试找出过滤器查询(fq 参数),因此否定查询应该可以正常工作。
【解决方案2】:

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

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

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

【讨论】:

  • 似乎 -startDate:* 的行为与 -startDate:[* TO *] 一样。我的意思是,如果我将 fq 设置为 -startDate:* 我会得到 3 个结果。如果我将 fq 设置为 -startDate:* OR startDate:[* TO NOW/DAY+1DAY] 我再次得到零。
【解决方案3】:

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 对孤独否定查询的支持。


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

【讨论】:

  • 我认为这就是正在发生的事情。 A 做了一个“调试”查询,它被翻译成 startDate:[* TO NOW/DAY+1DAY] -startDate:[* TO *],这确实没有意义。我确实认为默认值是理想的,但对 null 的支持只是暂时的,同时再次填充索引(使用非 null 值)。
【解决方案4】:

我使用了femtoRgon's answer,并且能够构造一个包含范围和空白值的查询。

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

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

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

【讨论】:

    猜你喜欢
    • 2022-10-06
    • 2011-09-29
    • 2011-10-13
    • 1970-01-01
    • 2010-09-07
    • 2010-10-04
    • 2011-01-15
    相关资源
    最近更新 更多