jme*_*end 6 search solr solr-query-syntax
以下过滤器查询返回零结果(使用*:*作为查询):
-startDate:[* TO *] OR startDate:[* TO NOW/DAY+1DAY]
Run Code Online (Sandbox Code Playgroud)
但如果我只过滤:
-startDate:[* TO *]
Run Code Online (Sandbox Code Playgroud)
我得到3个结果.
如果我只过滤:
startDate:[* TO NOW/DAY+1DAY]
Run Code Online (Sandbox Code Playgroud)
我得到161个结果.
为什么组合的FQ返回零结果?我想要的是过滤器返回任何开始日期为null或开始日期在今天之前的文档.
编辑:
我正在使用Solr 4.2.1.2013.03.26.08.26.55
编辑:
嗯,奇怪的是,听起来有同事建议将括号括在这两个部分:
(-startDate:[* TO *]) OR (startDate:[* TO NOW/DAY+1DAY])
Run Code Online (Sandbox Code Playgroud)
不知怎的,它奏效了.我仍然很好奇为什么会有所作为.希望有人可以解释一下.
谢谢!
Solr支持纯负面查询.他们这样做,基本上是通过将纯粹的否定扩展为:
*:* -startDate:[* TO *]
Run Code Online (Sandbox Code Playgroud)
但是,你把它结合在一个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值,更好的想法是存储默认值.*:*并且通过扩展,像这样的纯负面查询必须扫描整个索引,因此表现非常糟糕.提供默认值将提高性能,并防止出现这种令人困惑的情况.