如何查询 SOLR 的空字段?
Posted
技术标签:
【中文标题】如何查询 SOLR 的空字段?【英文标题】:How to query SOLR for empty fields? 【发布时间】:2011-05-13 10:08:34 【问题描述】:我有一个很大的 solr 索引,我注意到一些字段没有正确更新(索引是动态的)。
这导致某些字段的“id”字段为空。
我已经尝试了这些查询,但它们不起作用:
id:''
id:NULL
id:null
id:""
id:
id:['' TO *]
有没有办法查询空字段?
谢谢
【问题讨论】:
【参考方案1】:一个警告!如果你想通过 OR 或 AND 组合它,你不能以这种形式使用它:
-myfield:*
但你必须使用
(*:* NOT myfield:*)
这种形式是完全可组合的。显然 SOLR 会将第一种形式扩展到第二种形式,但仅当它是顶部节点时。希望这可以为您节省一些时间!
【讨论】:
这个答案应该得到比实际更多的分数。您为我们节省了很多时间! 这里也是+1。我实现了其他选项,但我必须将其包含在 fq= 而不是 q= 中,并且还必须实现 OR 来检查字段是否为空或具有特定值。这是适用于该用例的唯一选项。 我同意这应该是问题的公认答案 你帮我省了很多麻烦。我不确定谢谢你就足够了。【参考方案2】:您可以使用过滤器查询来做到这一点 q=*:*&fq=-id:*
【讨论】:
【参考方案3】:您也可以这样使用它。
fq=!id:['' TO *]
【讨论】:
【参考方案4】:如果你有一个很大的索引,你应该使用一个默认值
<field ... default="EMPTY" />
然后查询这个默认值。 这比 q=-id:["" TO *]
高效得多【讨论】:
这仅适用于字符串类型的字段吗?对于布尔值,你会怎么做? 我猜,它应该以同样的方式工作。但我从来没有检查过。【参考方案5】:如果您使用的是 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));
【讨论】:
【参考方案6】:根据SolrQuerySyntax,可以使用q=-id:[* TO *]
。
【讨论】:
这应该被标记为正确答案。见***.com/questions/10722145/…【参考方案7】:试试这个:
?q=-id:["" TO *]
【讨论】:
尽管 SolrQuerySyntax 页面显示 -id:[* TO *],但在 solr 1.4 上只有 -id:["" TO *] 对我有用。 @user2043553 不,如果你?q=-id:*
你会得到Cannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
@YzmirRamirez 我已经尝试了 Solr 4.5.1 的示例,?q=-id:*
似乎按预期工作。可能解析错误与这个issue有关。
抱歉,忘记了版本...Lucene Specification Version: 3.2.0
我正在使用。很高兴他们在 Solr 4.5.1 中添加了语法。
请注意,此语法似乎还返回字段值以空格开头的行(在 Solr 4.3 中)以上是关于如何查询 SOLR 的空字段?的主要内容,如果未能解决你的问题,请参考以下文章
如何编写一个 solr 查询来检索数字字段值小于指定值的所有记录?
SOLR 使用 CONCAT 函数查询从字段中丢失了一些单词 - 如何使其处理所有单词?