search - example - usando OR y NOT en la consulta solr
solr vs lucene (5)
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 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 coincida con superneat , también tengo la intención de asegurar 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 los 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?
Actualmente, Solr 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 comprueba si la consulta de nivel superior es una consulta puramente negativa. Esto significa que una consulta como la bar OR (-foo)
no se modifica, ya que la consulta puramente negativa se encuentra en una bar OR (-foo)
de la consulta de nivel superior. Necesita transformar esta consulta usted mismo en la bar OR (*:* -foo)
Puede verificar la explicación de la consulta de solr para verificar la transformación de la consulta:
?q=-title:foo&debug=query
se transforma a
(+(-title:foo +MatchAllDocsQuery(*:*))
Combinando comentarios de un par de respuestas diferentes 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
(mi_campo = mi_valor o mi_campo es nulo):
(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.
No sé por qué eso no funciona, pero este es lógicamente equivalente y funciona:
-(myField:superneat AND -myOtherField:somethingElse)
Tal vez tiene algo que ver con la definición del mismo campo dos veces en la consulta ...
¡Intenta preguntar en el grupo de solr-usuario , luego publica aquí la respuesta final!
Puede encontrar el seguimiento para el grupo de usuarios de solr en: solr user mailling list
La idea prevaleciente es que el operador NOT solo se puede usar para eliminar resultados de una consulta, no solo para excluir elementos de todo el conjunto de datos. Me gusta la sintaxis que sugirió mausch, ¡gracias!
Instead of "NOT [condition]" use "(*:* NOT [condition])"