2011-10-06 23 views
8

La última opción para resolver esto fue preguntarle a StackOverflow.Cómo O valor nulo en la consulta Apache Solr?

Estoy tratando de crear una consulta Solr para obtener los documentos que tienen un valor específico en una de sus campos o que no tiene un valor ...

Teóricamente, esta consulta debería haber funcionado.

Aquí hay alguna información:

Consulta: (Nombre: john) - contador> Resultado: 15383 // Johns

Consulta: (nombre: * {A} *) - -> recuento Resultado: 61013 // Las personas que tienen un nombre

consulta: - (nombre: * {a} *) -> recuento Resultado: 216888 // Las personas que no tienen un nombre

Ahora, cuando uso la primera y la tercera consulta en una misma consulta con el operador OR, espero obtener (216888 + 15383) resultados. Pero SOLR da 15383 resultados, simplemente ignora el efecto de la tercera consulta:

Consulta: + ((Nombre: john) (- (nombre: * {A} *))) // Esta es la consulta que estaba usado.

¿Esto es un error de Solr o estoy haciendo mal en la consulta? La fusión de dos resultados de consulta es una solución adicional, pero no quiero hacer una implementación de código adicional si pudiera hacerlo con una simple consulta.

Cualquier ayuda sería apreciada.

Respuesta

16

(-name:[* TO *] AND *:*) OR name:john

+0

trabajado por mí !! – Raj

+0

Esto es justo lo que necesitaba. Gracias. ¿Sería capaz de explicar lo que 'AND *: *' hace en este ejemplo? Veo que mi búsqueda no funciona si dejo esa parte, no estoy seguro de por qué. –

+0

'*: *' significa todas las filas. '*: * -name: *' significa todas las filas sin un valor de nombre. 'name: john OR (*: * -name: *)' se puede traducir a SQL como 'name = 'john' O el nombre IS NULL' – Semra

-1

tratar la consulta a continuación -

q=(name:john OR -(name:[* TO *])) 
+0

Still same. 15383 resultados. – emregecer

+2

Encontré la solución en este [enlace] (http://stackoverflow.com/questions/1343794/searching-for-date-range-or-null-no-field-in-solr) – emregecer

+1

- (- (name: john) + (nombre: {* TO *})) – emregecer

1

También puede utilizar de esta manera.

&fq=name:john OR !name:['' TO *]