【发布时间】:2011-05-13 10:08:34
【问题描述】:
我有一个很大的 solr 索引,我注意到一些字段没有正确更新(索引是动态的)。
这导致某些字段的“id”字段为空。
我已经尝试了这些查询,但它们不起作用:
id:''
id:NULL
id:null
id:""
id:
id:['' TO *]
有没有办法查询空字段?
谢谢
【问题讨论】:
我有一个很大的 solr 索引,我注意到一些字段没有正确更新(索引是动态的)。
这导致某些字段的“id”字段为空。
我已经尝试了这些查询,但它们不起作用:
id:''
id:NULL
id:null
id:""
id:
id:['' TO *]
有没有办法查询空字段?
谢谢
【问题讨论】:
一个警告!如果你想通过 OR 或 AND 组合它,你不能以这种形式使用它:
-myfield:*
但你必须使用
(*:* NOT myfield:*)
这种形式是完全可组合的。显然 SOLR 会将第一种形式扩展到第二种形式,但仅当它是顶部节点时。希望这可以为您节省一些时间!
【讨论】:
您可以使用过滤器查询来做到这一点 q=*:*&fq=-id:*
【讨论】:
您也可以这样使用它。
fq=!id:['' TO *]
【讨论】:
如果你有一个很大的索引,你应该使用一个默认值
<field ... default="EMPTY" />
然后查询这个默认值。 这比 q=-id:["" TO *]
高效得多【讨论】:
如果您使用的是 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 参数是否为真
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));
【讨论】:
根据SolrQuerySyntax,可以使用q=-id:[* TO *]。
【讨论】:
试试这个:
?q=-id:["" TO *]
【讨论】:
?q=-id:* 你会得到Cannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
?q=-id:* 似乎按预期工作。可能解析错误与这个issue有关。
Lucene Specification Version: 3.2.0我正在使用。很高兴他们在 Solr 4.5.1 中添加了语法。