en utilisant OU et NON dans la requête solr

Je travaille sur une requête similaire à celle-ci:

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

Lors de l’exécution, aucun résultat n’est renvoyé. L’utilisation de critères de part et d’autre du OU NON renvoie des résultats auxquels je m’attendais – ils ne fonctionnent tout simplement pas bien ensemble. Dans le cas où myField correspond à superneat , j’ai également l’intention de vérifier que myOtherField est défini sur somethingElse , mais si myField n’est pas en surnombre , incluez-le dans les résultats.

Quelqu’un peut-il expliquer pourquoi solr ne renvoie pas de résultats pour ce type de requête? La requête doit-elle être restructurée d’une manière ou d’une autre – ou existe-t-il une manière différente d’utiliser le solr pour obtenir le résultat souhaité?

Je ne sais pas pourquoi ça ne marche pas, mais celui-ci est logiquement équivalent et ça marche:

 -(myField:superneat AND -myOtherField:somethingElse) 

Peut-être que cela a quelque chose à voir avec la définition du même champ deux fois dans la requête …

Essayez de demander au groupe d’utilisateurs solr , puis publiez ici la réponse finale!

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

Solr recherche actuellement une requête “purement négatif” et insère *:* (qui correspond à tous les documents) pour que cela fonctionne correctement.

-foo est transformé par solr en (*:* -foo)

La grande mise en garde est que Solr vérifie uniquement si la requête de niveau supérieur est une requête purement négative! Cela signifie donc qu’une requête comme bar OR (-foo) n’est pas modifiée car la requête négative pure se trouve dans une sous-clause de la requête de niveau supérieur. Vous devez transformer cette requête vous-même en bar OR (*:* -foo)

Vous pouvez vérifier l’explication de la requête solr pour vérifier la transformation de la requête:

 ?q=-title:foo&debug=query 

est transformé en

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

En rassemblant des commentaires à partir de deux réponses différentes, dans la documentation de Solr et dans la question SO, j’ai trouvé que la syntaxe suivante produisait le résultat correct pour mon cas d’utilisation

(my_field = my_value ou my_field est null):

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

Cela fonctionne pour solr 4.1.0. Ceci est légèrement différent du cas d’utilisation du PO; mais je pensais que les autres le trouveraient utile.

Vous pouvez trouver la suite dans le groupe Solr-User sur:

L’idée dominante est que l’opérateur NOT ne peut être utilisé que pour supprimer des résultats d’une requête – et pas seulement pour exclure des éléments de l’dataset. J’aime la syntaxe que vous avez suggérée mausch – merci!