【问题标题】:How to query SOLR for empty fields?如何查询 SOLR 的空字段?
【发布时间】:2011-05-13 10:08:34
【问题描述】:

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

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

我已经尝试了这些查询,但它们不起作用:

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

有没有办法查询空字段?

谢谢

【问题讨论】:

    标签: solr lucene


    【解决方案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 *]

          【讨论】:

          【解决方案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 中)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多