空のフィールドのSOLRをクエリする方法は?


112

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

これにより、一部のフィールドに「id」フィールドが空になります。

私はこれらのクエリを試しましたが、うまくいきませんでした:

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

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

ありがとう

回答:


144

これを試して:

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

7
SolrQuerySyntaxページには-id:[* TO *]とありますが、solr 1.4では-id:["" TO *]のみが機能しました。
ジョナサントラン

1
@ user2043553いいえ、もしあなた?q=-id:*が得るならCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez 14

1
@YzmirRamirez Solr 4.5.1の例を試してみましたが、?q=-id:*期待どおりに動作するようです。おそらく、解析エラーはこの問題に関連しています。
user2043553 2014

申し訳ありませんが、バージョンを忘れてしまいました... Lucene Specification Version: 3.2.0私が使っていました。Solr 4.5.1で構文を追加してくれてうれしい。
Yzmir Ramirez 2014

この構文はフィールド値が空白で始まる行も返すようです(Solr 4.3)
metatechbe

89

注意点が1つあります。これをORまたはANDで作成する場合は、次の形式では使用できません。

-myfield:*

しかし、あなたは使用しなければなりません

(*:* NOT myfield:*)

このフォームは完全に合成可能です。明らかにSOLRは最初のフォームを2番目のフォームに展開しますが、それがトップノードである場合に限られます。これにより時間を節約できることを願っています!


2
この答えは、実際よりも多くのポイントに値します。あなたは私たちに多くの時間を節約してくれました!
Zac

ここでも+1。他のオプションを実装しましたが、q =ではなくfq =に含める必要があり、また、フィールドが空であるかどうか、または特定の値があるかどうかを確認するためにORを実装する必要がありました。これは、そのユースケースで機能した唯一のオプションです。
Pixelmixer 2016年

私はこれが質問の受け入れられた回答であるべきであることに同意します
ティンカー

あなたは私をそんなに頭痛の種から救った。よろしくお願いします。
カムウェイ2018


11

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

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

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


これは文字列型のフィールドでのみ機能しますか?ブール値の場合はどうしますか?
2016年

おそらく、同じように機能するはずです。しかし、私はそれをチェックしたことがありません。
Matthias M


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.