usando OR y NO en la consulta solr


83

Estoy trabajando en una consulta de solr similar a la siguiente:

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

Al ejecutar esto, no se devuelven resultados. El uso de criterios a ambos lados de OR NOT devuelve los resultados que esperaba, simplemente no funcionan bien juntos. En el caso de que myField coincida con superneat , tengo la intención de asegurarme también de que myOtherField esté configurado en somethingElse , pero si myField no es superneat , inclúyalo en los resultados.

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

Respuestas:


82

No sé por qué eso no funciona, pero éste es lógicamente equivalente y hace el trabajo:

-(myField:superneat AND -myOtherField:somethingElse)

Tal vez tenga algo que ver con definir el mismo campo dos veces en la consulta ...

Intente preguntar en el grupo de usuarios solr , ¡luego publique aquí la respuesta final!


¡Gracias por tu ayuda! De hecho, esto funciona, y se lo he planteado al grupo de usuarios solr. Publicaré aquí cualquier información útil que escuche de ellos.
stolenricecakes

8
Tenga en cuenta que -myField:superneat OR myOtherField:somethingElsetambién sería lo mismo y es un poco más simple.
Yorick Sijsling

3
@YorickSijsling, el punto es que, aunque es lógicamente equivalente, Solr a veces no hace frente muy bien a consultas puramente negativas como la que publicó el OP o la que usted publicó.
Mauricio Scheffer

@Mauricio Scheffer - Lo cuestionaría por completo. ¿Podría explicar más sobre cómo no se adapta muy bien? Ejecutamos condicionales bastante complejos aquí y descubrimos que se adapta muy bien a miles de millones de documentos.
terrance.a.snyder

@ terrance.a.snyder "condicionales complejos"! = "consultas puramente negativas". Además, las cosas podrían haber mejorado en versiones recientes de Solr, no lo he comprobado.
Mauricio Scheffer

42
Instead of "NOT [condition]" use "(*:* NOT [condition])"

1
¡Muchas gracias! Este funcionó para mí incluso para consultas complejas, mientras que el enfoque (myField: superneat AND -myOtherField: somethingElse) - ¡no lo hizo!
dpetruha

33

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

-foo es transformado por solr en (*:* -foo)

La gran advertencia es que Solr solo verifica si la consulta de nivel superior es una consulta negativa pura. Esto significa que una consulta como bar OR (-foo)no se cambia ya que la consulta negativa pura está en una subcláusula de la consulta de nivel superior. Necesita transformar esta consulta usted mismo enbar OR (*:* -foo)

Puede consultar la explicación de la consulta solr para verificar la transformación de la consulta:

?q=-title:foo&debug=query

se transforma en

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

1
edismax maneja las consultas negativas puras anidadas correctamente, ¿verdad? ¿Ha habido alguna discusión sobre parchear el analizador de consultas Lucene para admitirlos de la misma manera?
Peter Dixon-Moses

24

Al reunir comentarios de un par de respuestas diferentes aquí, en los documentos de 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 nulo):

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

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


1
Me encontré exactamente con este escenario hoy en Solr 5, y esta sugerencia funciona.
Ryan Shelley

9

Puede encontrar el seguimiento del grupo de usuarios solr en: lista de correo de usuarios solr

La idea predominante es que el operador NOT solo se puede usar para eliminar resultados de una consulta, no solo para excluir cosas de todo el conjunto de datos. Resulta que me gusta la sintaxis que sugirió mausch, ¡gracias!


3

Solo para agregar otro caso inesperado, aquí está la consulta que no devolvía los resultados esperados:

*:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )

field_ben mi caso, es algo en lo que realizo facetas y necesitaba apuntar al término de consulta "foo" solo en ese tipo (barra)

Tuve que insertar otro *:* después de la condición o para que esto funcione, así:

*:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )

editar: esto está en solr 6.6.3


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.