寻找一种方法来转换下面的表达式到solr查询。-field:1 OR -field:*我试过几种方法,-field:1 OR -field:*个-(-field:1 AND field:*)(-field:1 OR (*:* -field:*))
-field:1 OR -field:*
-(-field:1 AND field:*)
(-field:1 OR (*:* -field:*))
qhhrdooz1#
Solr标准查询解析器不支持在字段中搜索空值。在这种情况下,需要取消过滤器(排除字段中具有任何值的文档),以便查询保持有效。但是,最好使用范围查询,以防止在否定子查询中使用通配符时出现不一致的行为。所以ISNULL(field)变成了-field:[* TO *]另外,在同一个fq参数中应用一个过滤器和一个求反过滤器时,需要在后者上添加*:*,并使用括号确保第一个-运算符仅应用于第一个过滤器,否则OR将无法正确应用。因此,如果要将此过滤器与其他过滤器组合,请确保该过滤器与结果集相交(假设该过滤器应应用于所有文档):
ISNULL(field)
-field:[* TO *]
*:*
-
fq=(-field:[* TO *]) OR (*:* AND -field:<val>)
请注意,这相当于:
fq=-(field:[* TO *] AND field:<val>)
这意味着您只需要该部分(只要<val>不为空,即与1不同的值匹配包括空值/空值):
<val>
fq=-field:<val>
1条答案
按热度按时间qhhrdooz1#
Solr标准查询解析器不支持在字段中搜索空值。在这种情况下,需要取消过滤器(排除字段中具有任何值的文档),以便查询保持有效。
但是,最好使用范围查询,以防止在否定子查询中使用通配符时出现不一致的行为。
所以
ISNULL(field)
变成了-field:[* TO *]
另外,在同一个fq参数中应用一个过滤器和一个求反过滤器时,需要在后者上添加
*:*
,并使用括号确保第一个-
运算符仅应用于第一个过滤器,否则OR将无法正确应用。因此,如果要将此过滤器与其他过滤器组合,请确保该过滤器与结果集相交(假设该过滤器应应用于所有文档):请注意,这相当于:
这意味着您只需要该部分(只要
<val>
不为空,即与1不同的值匹配包括空值/空值):