如何查询SOLR中的空字段?

133

我有一个庞大的solr索引,注意到某些字段没有正确更新(该索引是动态的)。

这导致一些字段的"id"字段为空。

我尝试了以下查询,但它们没有起作用:

 id:''
 id:NULL
 id:null
 id:""
 id:
 id:['' TO *]
有没有一种方法可以查询空字段?
谢谢
8个回答

161

试试这个:

?q=-id:["" TO *]

7
尽管SolrQuerySyntax页面上写着-id:[* TO *],但在Solr 1.4上,只有-id:["" TO *]对我起作用。 - Jonathan Tran
1
@user2043553 不对,如果你使用 ?q=-id:*,你会得到 Cannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery 的错误提示。 - Yzmir Ramirez
1
@YzmirRamirez 我已经尝试了Solr 4.5.1的示例,?q=-id:*似乎按预期工作。也许解析错误与这个问题有关。 - user2043553
抱歉,我忘记了版本...我使用的是Lucene规范版本:3.2.0。很高兴Solr 4.5.1中添加了这个语法。 - Yzmir Ramirez
请注意,这种语法似乎也会返回字段值以空格开头的行(在Solr 4.3中)。 - metatechbe

131

一个警告!如果你想通过OR或AND组成它,你不能使用这个形式:

-myfield:*

但是必须使用

(*:* NOT myfield:*)

这个表单完全可以组合。显然,SOLR会将第一个表单扩展到第二个表单,但仅当它是顶级节点时。希望这能为您节省一些时间!


12
这个答案的分数应该比它实际得到的要高。你帮我们节省了很多时间! - Zac
3
我已经实现了其他选项,但是我不得不将它包含在fq=中,而不是q=中,并且还必须实现OR来检查字段是否为空或具有特定值。这是适用于该用例的唯一选项。 - Pixelmixer
4
我同意这应该成为该问题的被接受答案。 - tinker
5
你帮我省去了很大的麻烦,我不确定“谢谢”这个词足以表达我的感激之情。 - Camway
我还必须使用 fq,其中 q = *:*。另请注意,您显然无法针对非索引/仅存储字段执行此检查,这让我有点困惑。 - markson edwardson

71

1
这应该被标记为正确答案。请参见https://dev59.com/H2gv5IYBdhLWcg3wSewe - Sudheer Aedama

13

如果你有一个很大的索引,你应该使用默认值

   <field ... default="EMPTY" />

然后查询此默认值。这比q=-id:["" TO *]更有效。


这只适用于字符串类型的字段吗?那布尔类型的字段该怎么做呢? - jared
我猜应该是以同样的方式工作。但我从未检查过它。 - Matthias M

2
你可以像这样使用它。
fq=!id:['' TO *]

1
你可以通过过滤查询来完成 q=*:*&fq=-id:*

1

在这里添加一条注释,为了使字段可以被搜索,需要在 SOLR 模式中将字段类型设置为 "indexed = true"。然后您可以使用 "field_name:*" 来搜索字符串类型,使用 "field_name:[* TO *]" 来搜索数字类型。


1
如果您正在使用SolrSharp,则不支持负查询。
您需要更改QueryParameter.cs(创建新参数)。
private bool _negativeQuery = false;

public QueryParameter(string field, string value, ParameterJoin parameterJoin = ParameterJoin.AND, bool negativeQuery = false)
{
    this._field = field;
    this._value = value.Trim();
    this._parameterJoin = parameterJoin;
    this._negativeQuery = negativeQuery;
}

public bool NegativeQuery
{
    get { return _negativeQuery; }
    set { _negativeQuery = value; }
}

在 QueryParameterCollection.cs 类中,ToString() 方法被重写,如果 Negative 参数为 true,则执行相应操作。
arQ[x] = (qp.NegativeQuery ? "-(" : "(") + qp.ToString() + ")" + (qp.Boost != 1 ? "^" + qp.Boost.ToString() : "");

当您调用参数创建器时,如果它是负值,请简单地更改属性。

List<QueryParameter> QueryParameters = new List<QueryParameter>();
QueryParameters.Add(new QueryParameter("PartnerList", "[* TO *]", ParameterJoin.AND, true));

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