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

Eric Wilson
źródło

Odpowiedzi:

144

Spróbuj tego:

?q=-id:["" TO *]
netcoder
źródło
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!

KK1402
źródło
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 *]

Matthias M.
źródło
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
2

Możesz go również używać w ten sposób.

fq=!id:['' TO *]
user1976546
źródło
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));
Adriano Galesso Alves
źródło
1

możesz to zrobić za pomocą zapytania filtrującego q = *: * & fq = -id: *

Nimrod Cohen
źródło