¿Cómo consultar SOLR para campos vacíos?


112

Tengo un índice de solr grande y he notado que algunos campos no se actualizan correctamente (el índice es dinámico).

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

Probé estas consultas, pero no funcionaron:

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

¿Hay alguna forma de consultar campos vacíos?

Gracias

Respuestas:


144

Prueba esto:

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

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

1
@ user2043553 No, si ?q=-id:*obtieneCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez

1
@YzmirRamirez He intentado con el ejemplo de Solr 4.5.1 y ?q=-id:*parece funcionar como se esperaba. Quizás el error de análisis esté relacionado con este problema .
user2043553

Lo siento, olvidé la versión ... Lucene Specification Version: 3.2.0que estaba usando. Me alegro de que hayan agregado la sintaxis en Solr 4.5.1.
Yzmir Ramirez

Tenga en cuenta que esta sintaxis también parece devolver filas cuyo valor de campo comienza con un espacio en blanco (en Solr 4.3)
metatechbe

89

¡Una advertencia! Si desea redactar esto a través de OR o Y, no puede usarlo en este formulario:

-myfield:*

pero debes usar

(*:* NOT myfield:*)

Esta forma es perfectamente componible. Aparentemente, SOLR expandirá el primer formulario al segundo, 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 has ahorrado mucho tiempo!
Zac

+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 tenía un valor específico. Esta es la única opción que funcionó para ese caso de uso.
Pixelmixer

Estoy de acuerdo en que esta debería ser la respuesta aceptada a la pregunta
tinker

Me ahorraste tanto dolor de cabeza. No estoy seguro de que gracias sea suficiente.
Camway


11

Si tiene un índice grande, debe usar un valor predeterminado

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

y luego consulte este valor predeterminado. Esto es mucho más eficiente que q = -id: ["" TO *]


¿Esto solo funcionaría para campos de tipo String? ¿Cómo lo harías para boolean?
jared

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


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, la anulación de ToString (), busca si el parámetro Negative es verdadero

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

Cuando llama al creador del parámetro, si es un valor negativo. Simple cambio de propiedad

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.