2010-11-21 10 views
87

Mam duży indeks solr i zauważyłem, że niektóre pola nie są poprawnie aktualizowane (indeks jest dynamiczny).Jak zapytać SOLR o puste pola?

To spowodowało, że niektóre pola mają puste pole "id".

Próbowałem te pytania, ale nie działa:

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

Czy istnieje sposób do kwerendy puste pola?

Dzięki

Odpowiedz

114

Spróbuj tego:

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

Mimo że strona SolrQuerySyntax mówi -id: [* TO *], tylko -id: ["TO *] działało dla mnie na Solr 1.4. –

+2

Czy '? Q = -id: *' również nie działa? – user2043553

+1

@ user2043553 Nie, jeśli '' q = -id: * 'otrzymasz' Can not parsse '-q: *': '*' lub '?' niedozwolone jako pierwszy znak w WildcardQuery' –

63

Według SolrQuerySyntax, można użyć q=-id:[* TO *].

+0

To działało dla mnie w Solr 4.0 z polem int –

+1

To powinno być zaznaczone jako poprawną odpowiedź Zobacz http://stackoverflow.com/questions/10722145/solr-how-do-i-construct-a-query-that-requires-a-not-null-location-field –

1

Jeśli używasz SolrSharp, nie obsługuje 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; } 
} 

A w klasie QueryParameterCollection.cs, ToString() przesłanianie, wygląda jeśli parametr Negative prawda

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

Po wywołaniu kreatora parametrów, jeśli jest to wartość ujemna. Proste Zmiana propertie

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

Jeśli masz dużą indeksu, należy użyć wartości domyślnej

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

a następnie zapytać o tej wartości domyślnej. Jest to znacznie wydajniejsze niż q = -id: ["" TO *]

+0

Czy to działa dla pól typu String? Jak zrobiłbyś to dla boolean? – jared

+0

Myślę, że to powinno działać w taki sam sposób, ale nigdy go nie sprawdzałem –

2

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

fq=!id:['' TO *] 
1

można zrobić z filtrem zapytania q = *: * & FQ = -id: *

55

Jedno zastrzeżenie! Jeśli chcesz komponować to poprzez ALBO albo i nie można go używać w tej formie:

-myfield:* 

ale trzeba użyć

(*:* NOT myfield:*) 

Ta forma jest doskonale sk. Wygląda na to, że SOLR rozszerzy pierwszą formę do drugiej, ale tylko wtedy, gdy jest najwyższym węzłem. Mam nadzieję, że to oszczędza ci trochę czasu!

+2

Ta odpowiedź zasługuje na więcej punktów niż w rzeczywistości. – Zac

+0

+1 również tutaj. Zaimplementowałam inne opcje, ale musiałem włączyć je w fq = zamiast q = i również musiałem zaimplementować OR, aby sprawdzić czy pole było puste LUB miał konkretna wartość. Jest to jedyna opcja, która działała w tym przypadku użycia. –

+0

Zgadzam się, że to powinna być akceptowana odpowiedź na pytanie – tinker

Powiązane problemy