¿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

Eric Wilson
fuente

Respuestas:

144

Prueba esto:

?q=-id:["" TO *]
netcoder
fuente
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!

KK1402
fuente
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 *]

Matthias M
fuente
¿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
2

También puedes usarlo así.

fq=!id:['' TO *]
usuario1976546
fuente
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));
Adriano Galesso Alves
fuente
1

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

Nimrod Cohen
fuente