Pregunta usando OR y NOT en la consulta solr


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 Mi campo partidos superneat, Tengo la intención de asegurarme también de que myOtherField se establece en algo más, pero si Mi campo no es superneat, incluirlo 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?


74
2018-03-11 14:34


origen


Respuestas:


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

-(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 solr-usuario, luego publique aquí la respuesta final!


76
2018-03-11 15:41



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

35
2017-08-21 20:20



Actualmente, Solr busca una consulta e inserciones "negativas puras" *:* (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. Entonces esto significa que una consulta como bar OR (-foo) no se modifica porque la consulta puramente negativa se encuentra en una subcláusula de la consulta de nivel superior. Necesita transformar esta consulta usted mismo en 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(*:*))

27
2018-01-28 15:01



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.


20
2018-03-24 17:34



Puede encontrar el seguimiento para el grupo de usuarios solr en: lista de mailling de usuario solr

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!


8
2018-03-13 12:27