Jak zapytać SOLR o puste pola?


112

Mam duży indeks SOLR i zauważyłem, że niektóre pola nie są poprawnie aktualizowane (indeks jest dynamiczny).

Spowodowało to, że niektóre pola mają puste pole „id”.

Próbowałem tych zapytań, ale nie zadziałały:

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

Czy istnieje sposób na zapytanie o puste pola?

Dzięki

Odpowiedzi:


144

Spróbuj tego:

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

7
Mimo że strona SolrQuerySyntax mówi -id: [* TO *], tylko -id: ["" TO *] działało dla mnie na solr 1.4.
— Jonathan Tran,

1
@ user2043553 Nie, jeśli ?q=-id:*dostanieszCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
— Yzmir Ramirez

1
@YzmirRamirez Próbowałem na przykładzie Solr 4.5.1 i ?q=-id:*wydaje się, że działa zgodnie z oczekiwaniami. Może błąd parsowania jest związany z tym problemem .
— user2043553

Przepraszam, zapomniałem wersji ... Lucene Specification Version: 3.2.0której używałem. Cieszę się, że dodali składnię w Solr 4.5.1.
— Yzmir Ramirez

Uważaj, ta składnia wydaje się również zwracać wiersze, których wartość pola zaczyna się od spacji (w Solr 4.3)
— metatechbe

89

Jedno zastrzeżenie! Jeśli chcesz napisać to przez OR lub ORAZ nie możesz tego użyć w tej formie:

-myfield:*

ale musisz użyć

(*:* NOT myfield:*)

Ta forma jest doskonale komponowalna. Najwyraźniej SOLR rozszerzy pierwszą formę do drugiej, ale tylko wtedy, gdy jest to najwyższy węzeł. Mam nadzieję, że zaoszczędzi to trochę czasu!


2
Ta odpowiedź zasługuje na więcej punktów niż w rzeczywistości. Zaoszczędziłeś nam dużo czasu!
— Zac,

+1 również tutaj. Zaimplementowałem inne opcje, ale musiałem uwzględnić je w fq = zamiast q =, a także musiałem zaimplementować OR, aby sprawdzić, czy pole jest puste LUB ma określoną wartość. To jedyna opcja, która zadziałała w tym przypadku użycia.
— Pixelmixer

Zgadzam się, że to powinna być zaakceptowana odpowiedź na pytanie
— majstrować

Uratowałeś mi tyle bólu głowy. Nie jestem pewien, czy dziękuję jest wystarczające.
— Camway,


11

Jeśli masz duży indeks, powinieneś użyć wartości domyślnej

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

a następnie zapytaj o tę wartość domyślną. Jest to znacznie wydajniejsze niż q = -id: ["" TO *]


Czy to zadziała tylko dla pól typu String? Jak byś to zrobił dla wartości logicznych?
— jared

Myślę, że powinno działać w ten sam sposób. Ale nigdy tego nie sprawdzałem.
— Matthias M


1

Jeśli używasz SolrSharp, nie obsługuje on negatywnych zapytań.

Musisz zmienić QueryParameter.cs (Utwórz nowy parametr)

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

Natomiast w klasie QueryParameterCollection.cs przesłanie ToString () sprawdza, czy parametr Negative ma wartość true

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

W przypadku wywołania kreatora parametrów, jeśli jest to wartość ujemna. Prosta zmiana właściwości

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.