如何查询SOLR空字段?


112

我的Solr索引很大,并且我注意到某些字段没有正确更新(索引是动态的)。

这导致某些字段具有空的“ id”字段。

我已经尝试过这些查询,但是它们没有用:

 id:''
 id:NULL
 id:null
 id:""
 id:
 id:['' TO *]

有没有一种查询空字段的方法?

谢谢

Answers:


144

试试这个:

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

7
即使SolrQuerySyntax页上显示-id:[* TO *],也只有-id:[“” TO *]在solr 1.4上对我有用。
乔纳森·特兰

1
@ user2043553不,如果您?q=-id:*得到Cannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez 2014年

1
@YzmirRamirez我尝试过Solr 4.5.1的示例,并且?q=-id:*似乎按预期工作。解析错误可能与此问题有关
user2043553 2014年

抱歉,忘记了版本... Lucene Specification Version: 3.2.0我正在使用。很高兴他们在Solr 4.5.1中添加了语法。
伊兹密尔·拉米雷斯

注意,这种语法似乎还会返回其字段值以空格开头的行(在Solr 4.3中)
metatechbe'3

89

一个警告!如果要通过“或”或“与”组合,则不能以这种形式使用它:

-myfield:*

但是你必须使用

(*:* NOT myfield:*)

这种形式是完全可组合的。显然,SOLR会将第一种形式扩展到第二种形式,但前提是它是顶级节点。希望这可以节省您一些时间!


2
这个答案应该得到比实际更多的分数。您节省了我们很多时间!
扎克2015年

这里也是+1。我实现了其他选项,但必须将其包括在fq =中而不是q =中,并且还必须实现OR来检查该字段是否为空或具有特定值。这是适用于该用例的唯一选项。
Pixelmixer

我同意这应该是该问题的公认答案
修补匠

你真让我头疼。我不确定谢谢您是否足够。
卡威


11

如果索引较大,则应使用默认值

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

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


这仅适用于String类型的字段吗?您将如何为布尔值做呢?
震撼人心的

我想,它应该以相同的方式工作。但我从未检查过。
马提亚斯M


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.