2010-11-21 27 views
87

Tengo un gran índice de solr, y he notado que algunos campos no se actualizan correctamente (el índice es dinámico).¿Cómo consultar SOLR para campos vacíos?

Esto ha resultado en que algunos campos tengan un campo "id" vacío.

me han tratado estas consultas, pero no funcionó:

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

¿Hay una manera de consultar campos vacíos?

Gracias

Respuesta

114

Prueba esto:

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

Aunque la página SolrQuerySyntax dice -id: [* TO *], solo -id: ["" TO *] funcionó para mí en solr 1.4. –

+2

¿No funciona '? Q = -id: *' también? – user2043553

+1

@ user2043553 No, si '? Q = -id: *' obtienes 'No se puede analizar '-q: *': '*' o '?' no permitido como primer personaje en WildcardQuery' –

63

Según SolrQuerySyntax, puede utilizar q=-id:[* TO *].

+0

Esto funcionó en Solr 4.0 con un campo int. –

+1

Esto debe marcarse como la respuesta correcta. Ver http://stackoverflow.com/questions/10722145/solr-how-do-i-construct-a-query-that-requires-a-not-null-location-field –

1

Si está utilizando SolrSharp, no admite consultas negativas.

necesita cambiar QueryParameter.cs (Crear un nuevo parámetro)

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

Y en la clase QueryParameterCollection.cs, el ToString() de anulación, se ve si el parámetro negativa es cierto

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

Cuando llama al creador del parámetro, si es un valor negativo. el simple cambio propertie

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

Si usted tiene un índice grande, se debe utilizar un valor predeterminado

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

y después realizar una consulta para este valor por defecto. Esto es mucho más eficiente que q = -id: ["" TO *]

+0

¿Funcionaría esto solo? para campos de tipo String? ¿Cómo lo haría para boolean? – jared

+0

Supongo que debería funcionar de la misma manera. Pero nunca lo he comprobado. –

2

También lo puede usar así.

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

puede hacerlo con consulta de filtro q = *: * & fq = -id: *

55

Una advertencia! Si desea redactar esta vía OR o AND no se puede utilizar en esta forma:

-myfield:* 

pero debe utilizar

(*:* NOT myfield:*) 

Esta forma es perfectamente componibles. Aparentemente SOLR expandirá la primera forma a la segunda, pero solo cuando sea un nodo superior. Espero que esto te ahorre algo de tiempo!

+2

Esta respuesta merece más puntos de los que realmente tiene. Nos ha ahorrado mucho de tiempo! – Zac

+0

+1 aquí también. Implementé las otras opciones, pero tuve que incluirlo en un fq = en lugar de q = y también tuve que implementar un OR para verificar si el campo estaba vacío O tuve un valor específico Esta es la única opción que funcionó para ese caso de uso. –

+0

Acepto que esta debería ser la respuesta aceptada en la pregunta – tinker

Cuestiones relacionadas