2009-03-11 11 views
73

Estoy trabajando en una consulta Solr similar al siguiente:usando O y NO en la consulta Solr

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat) 

Cuando se ejecuta esto, se devuelve ningún resultado. El uso de criterios en cualquiera de los lados de O NO arroja resultados que yo esperaría, simplemente no funcionan bien juntos. En el caso de que myField coincide superneat, estoy con la intención de garantizar también que myOtherField se establece en somethingelse, pero si myField no es superneat, incluirlo en los resultados.

¿Alguien puede explicar por qué solr no está devolviendo resultados para este tipo de consulta? ¿Debería reestructurarse la consulta de alguna manera? ¿O hay una forma diferente en que solr se puede usar para lograr el resultado deseado?

Respuesta

76

No sé por qué esto no funciona, pero éste es lógicamente equivalente y que lo hace trabajo:

-(myField:superneat AND -myOtherField:somethingElse) 

Tal vez tenga algo que ver con la definición del mismo campo dos veces en el consulta ...

Intenta preguntar en el solr-user group, luego vuelve a publicar aquí la respuesta final.

+0

¡Gracias por su ayuda! Esto realmente funciona, y se lo he planteado al grupo de usuarios solr. Voy a publicar cualquier cosa útil que escuche de ellos aquí. – stolenricecakes

+8

Tenga en cuenta que '-myField: superneat OR myOtherField: somethingElse' también sería el mismo y es un poco más simple. –

+3

@YorickSijsling El punto es que, aunque es lógicamente equivalente, a veces Solr no se adapta muy bien a consultas puramente negativas como la que publicó el OP o la que ha publicado. –

8

Puede encontrar el seguimiento al grupo Solr por los usuarios en: solr user mailling list

La idea predominante es que el operador no sólo puede ser utilizado para eliminar los resultados de una consulta - no sólo excluye las cosas fuera de la totalidad conjunto de datos. Me gusta la sintaxis que sugirió mausch, ¡gracias!

34
Instead of "NOT [condition]" use "(*:* NOT [condition])" 
+1

Gracias mucho! Este me funcionó incluso para consultas complejas mientras que - (myField: superneat AND-myOtherField: somethingElse) approach - did not! – dpetruha

27

Solr comprueba actualmente para una consulta "pura negativa" e inserta *:* (que coincide con todos los documentos) para que funcione correctamente.

-foo se transforma por Solr en (*:* -foo)

La gran advertencia es que Solr sólo comprueba para ver si la consulta de nivel superior es una consulta negativa pura! Esto significa que una consulta como bar OR (-foo) no cambia, ya que la consulta puramente negativa se encuentra en una subcláusula de la consulta de nivel superior. Es necesario transformar esta consulta usted mismo en bar OR (*:* -foo)

Es posible comprobar la explicación consulta Solr para verificar la transformación consulta:

?q=-title:foo&debug=query 

se transforma en

(+(-title:foo +MatchAllDocsQuery(*:*)) 
+1

¡A gracias por la explicación! –

+1

* edismax * maneja las consultas negativas puras anidadas correctamente, ¿verdad? ¿Ha habido alguna discusión sobre cómo parchear el analizador de consultas de Lucene para que los soporte de la misma manera? –

19

La elaboración de los comentarios de un par diferente respuestas aquí, en los documentos Solr y en la otra pregunta SO, encontré que la siguiente sintaxis produce el resultado correcto para mi caso de uso

(my_field = my_value o my_field es null):

(my_field:"my_value" OR (*:* NOT my_field:*)) 

Esto funciona para Solr 4.1.0.Esto es ligeramente diferente que el caso de uso en el OP; pero, pensé que otros lo encontrarían útil.

+1

Se metió exactamente en este escenario hoy en Solr 5, y esta sugerencia funciona. –

Cuestiones relacionadas