Solr - 如何构建一个要求 Location 字段不为空的查询

37

我有一个Solr索引,其中包含一组以Location类型存储的坐标;我想查询具有非空值的文档。

在Location字段上执行非空检查的查询语法是什么?

4个回答

67

最标准的方式是这样的:

fieldName:[* TO *]

像Paige Cook建议的那样在左侧使用''也可能有效,但我不太信任它,就像我对上面所做的那样。由于这是针对位置字段的,您可能需要针对其中两个基础实际字段之一执行此操作,而不是针对此逻辑组合字段执行此操作。它们以fieldName开头,并以某种数字后缀结尾;请查看模式浏览器以查看实际名称。

在这里要注意的一个重要事项是,Solr执行此类查询非常昂贵,因为它必须对该字段进行完整的索引扫描。如果您有许多不同的位置字段值(成千上万?),那么这是一件大事。如果您在过滤查询中执行此操作,则它将被缓存,这或许是无意义的。如果您希望此查询运行快速,则应在索引时间索引一个布尔字段以指示是否存在此字段中的值。


谢谢David,[* TO *]语法与检查两个后备字段相结合似乎可以正常工作(例如field_0_coord:[* TO *] AND field_1_coord:[* TO *])。感谢您的性能提示! - STW
1
你不必针对两个坐标字段进行操作,这样会慢两倍,只需操作其中一个即可。如果其中一个有值,则另一个也有值,反之亦然。 - David Smiley
因为我刚在我们的项目中遇到了这个“解决方案”:不要将其用于字符串字段。 - SoS
@DavidSmiley 我也可以使用 fieldName:() 来实现字段的 NOT NULL 值。请问这两个查询 [ TO ] 和 () 之间是否有性能影响差异? - Chirag Shah
@ChiragShah,你的语法混淆了StackOverflow的格式,但我认为你是在问field:[* TO *]是否等同于field:*。我认为它们在2020年1月是相同的。 - David Smiley
@ChiragShah 你的句法弄混了 StackOverflow 的格式,但我猜你是在问 field:[* TO *] 是否等同于 field:*。我认为它们在2020年1月之前是相同的。 - David Smiley

12
您可以将以下内容添加到您的查询中:fieldname:['' TO *]。这相当于进行非空检查。
我从这篇文章中获取了这个信息 - Solr - Field Not Null Searches

谢谢Paige,但不幸的是,这似乎对“位置”无效。 - STW
再详细解释一下,该字段以及其后备字段都是数字类型;将它们与 '' 进行比较会导致 NumberFormatException 异常。 - STW
很抱歉我没有注意到这是一个数字。David Smiley给出了正确的答案。 - Paige Cook

7

对于位置字段(solr.LatLonType),请使用以下过滤查询:-fieldName:[-90,-180 TO 90,180] (此范围之外的坐标仍然无效)


-7

尝试这个 q= !fieldname:NULL 这将等同于 Fieldvalue 不是 NULL。

由 STW 提问 我有一个 Solr 索引,其中包含存储为 Location 类型的一组坐标;我想查询该字段具有非空值的文档。

如何查询语法执行 Location 字段上的 NOT NULL 检查?


查询 !fieldname:NULL 不起作用,显示错误 400: java.text.ParseException: 缺少括号:NULL。 - Murz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接