web-dev-qa-db-ja.com

空のフィールドのSOLRを照会する方法は?

大きなsolrインデックスがあり、一部のフィールドが正しく更新されていないことに気付きました(インデックスは動的です)。

これにより、一部のフィールドに空の「id」フィールドが含まれることになりました。

これらのクエリを試しましたが、機能しませんでした。

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

空のフィールドをクエリする方法はありますか?

ありがとう

104
user188962

これを試して:

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

1つの注意点! ORまたはANDでこれを作成する場合、このフォームでは使用できません。

-myfield:*

しかし、使用する必要があります

(*:* NOT myfield:*)

この形式は完全に構成可能です。どうやらSOLRは最初のフォームを2番目に展開しますが、それがトップノードの場合のみです。これで時間を節約できることを願っています!

77
KK1402

SolrQuerySyntax によると、q=-id:[* TO *]を使用できます。

69
Yuval F

インデックスが大きい場合は、デフォルト値を使用する必要があります

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

次に、このデフォルト値を照会します。これはq = -id:["" TO *]よりもはるかに効率的です。

10
Matthias M

このように使用することもできます。

fq=!id:['' TO *]
2
user1976546

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

フィルタークエリq = *:*&fq = -id:*で実行できます

1
Nimrod Cohen