如何查询 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 函数查询从字段中丢失了一些单词 - 如何使其处理所有单词?

如何使用spring-data-solr编写查询,返回特定字段的所有值的列表

检索 Solr 查询中的特定字段?

检索Solr查询中的特定字段?

如何在Solr中对日期字段进行排序?