Boş alanlar için SOLR nasıl sorgulanır?


112

Büyük bir solr dizinim var ve bazı alanların doğru şekilde güncellenmediğini fark ettim (dizin dinamik).

Bu, bazı alanların boş bir "kimlik" alanına sahip olmasına neden oldu.

Bu sorguları denedim ama işe yaramadı:

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

Boş alanları sorgulamanın bir yolu var mı?

Teşekkürler

Yanıtlar:


144

Bunu dene:

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

7
SolrQuerySyntax sayfası -id: [* TO *] yazsa da, sadece -id: ["" TO *] benim için Solr 1.4'te çalıştı.
Jonathan Tran

1
@ user2043553 Hayır, sen eğer ?q=-id:*sen almakCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Ýzmir Ramirez

1
@YzmirRamirez Solr 4.5.1 örneğiyle denedim ve ?q=-id:*beklendiği gibi çalışıyor gibi görünüyor. Belki ayrıştırma hatası bu sorunla ilgilidir .
user2043553

Pardon, sürümü unuttum ... Lucene Specification Version: 3.2.0Ben kullanıyordum. Sözdizimini Solr 4.5.1'e eklemelerine sevindim.
Yzmir Ramirez

Bu sözdiziminin alan değeri bir boşlukla başlayan satırları da döndürdüğüne dikkat edin (Solr 4.3'te)
metatechbe

89

Bir uyarı! Bunu OR veya AND aracılığıyla oluşturmak istiyorsanız, bu formda kullanamazsınız:

-myfield:*

ama kullanmalısın

(*:* NOT myfield:*)

Bu form mükemmel bir şekilde oluşturulabilir. Görünüşe göre SOLR, ilk formu ikinciye genişletecek, ancak yalnızca bir üst düğüm olduğunda. Umarım bu size biraz zaman kazandırır!


2
Bu cevap, gerçekte olduğundan daha fazla puanı hak ediyor. Bize çok zaman kazandırdın!
Zac

Burada da +1. Diğer seçenekleri uyguladım ancak bunu q = yerine fq = içine dahil etmem ve alanın boş olup olmadığını VEYA belirli bir değere sahip olup olmadığını kontrol etmek için bir VEYA uygulamam gerekiyordu. Bu kullanım durumu için işe yarayan tek seçenektir.
Pixelmixer

Bunun soru için kabul edilen cevap olması gerektiğine katılıyorum
tinker

Beni çok fazla baş ağrısından kurtardın. Emin değilim, teşekkür ederim yeterli.
Camway


11

Büyük bir dizininiz varsa, varsayılan bir değer kullanmalısınız

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

ve sonra bu varsayılan değeri sorgulayın. Bu, q = -id'den çok daha etkilidir: ["" TO *]


Bu yalnızca String türündeki alanlar için mi çalışır? Boole için nasıl yaparsınız?
jared

Sanırım aynı şekilde çalışmalı. Ama hiç kontrol etmedim.
Matthias M


1

SolrSharp kullanıyorsanız, olumsuz sorguları desteklemez.

QueryParameter.cs'yi değiştirmeniz gerekir (Yeni bir parametre oluşturun)

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

Ve QueryParameterCollection.cs sınıfında ToString () geçersiz kılma, Negatif parametresinin doğru olup olmadığına bakar

arQ[x] = (qp.NegativeQuery ? "-(" : "(") + qp.ToString() + ")" + (qp.Boost != 1 ? "^" + qp.Boost.ToString() : "");

Parametre oluşturucuyu çağırdığınızda, negatif bir değer ise. Özelliği basit bir şekilde değiştirin

List<QueryParameter> QueryParameters = new List<QueryParameter>();
QueryParameters.Add(new QueryParameter("PartnerList", "[* TO *]", ParameterJoin.AND, true));

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.