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.