2010-11-21 24 views
87

大きなソルインデックスがあり、一部のフィールドが正しく更新されていないことがわかりました(インデックスは動的です)。SOLRに空のフィールドを照会する方法は?

この結果、いくつかのフィールドには空の "id"フィールドがあります。

私は、これらのクエリを試してみましたが、彼らは動作しませんでした:

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

は、空のフィールドを照会する方法はありますか?

おかげ

答えて

114

はこれを試してみてください:

?q=-id:["" TO *] 
+6

SolrQuerySyntaxページで-id:[* TO *]と表示されても、solr 1.4では-id:["" *]だけが働いていました。 –

+2

'?q = -id:*'もうまくいきませんか? – user2043553

+1

@ user2043553いいえ、あなたが '?q = -id:*'ならば、 '-q:* ':' * 'または'? 'を解析できません。 WildcardQueryの最初の文字として許可されていません。 –

63

SolrQuerySyntaxによると、あなたはq=-id:[* TO *]を使用することができます。

+0

これはSolr 4.0でintフィールドを使用してくれました –

+1

これはマークする必要があります正解としてhttp://stackoverflow.com/questions/10722145/solr-how-do-i-construct-a-query-that-requires-a-not-null-location-field –

1

SolrSharpを使用している場合、否定クエリはサポートされません。負のパラメータがtrueの場合

あなたが

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

を(新しいパラメータを作成します)QueryParameter.csを変更する必要があり、QueryParameterCollection.csクラスでは、ToStringメソッド()のオーバーライドは、見え

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

propertieは、あなたが

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

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

+0

これはうまくいくのでしょうか? String型のフィールドの場合はどうすればよいでしょうか? – jared

+0

同じように動作するはずですが、私は決してチェックしませんでした –

2

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

fq=!id:['' TO *] 
1

あなたは、フィルタクエリ Q = *でそれを行うことができます:* & FQ = -id:*

55

1つの警告!あなたはORを経て、これを構成する場合、または、あなたがこのフォームで使用することはできません場合は、次の

-myfield:* 

いますが、このフォームは完全に構成可能である

(*:* NOT myfield:*) 

を使用する必要があります。明らかに、SOLRは最初のフォームを2番目のフォームに拡張しますが、これは最上位のノードである場合に限ります。これがあなたにある時間を節約することを願っています!

+2

この回答は、 – Zac

+0

+1ここにも他のオプションを実装しましたが、qqではなくfq =に含めなければなりませんでした。また、フィールドが空であるかどうかをチェックするORを実装しなければなりませんでした。特定の値。これは、そのユースケースのために働く唯一のオプションです。 –

+0

私はこれが質問の受け入れられた答えであるべきであることに同意します – tinker

関連する問題