2009-03-11 4 views
73

Je travaille sur une requête Solr semblable au suivant:en utilisant OR et NOT dans la requête solr

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

Lors de l'exécution cela, aucun résultat sont retournés. L'utilisation de critères de part et d'autre du OU NE renvoie pas les résultats auxquels je m'attendais - ils ne fonctionnent pas bien ensemble. Dans le cas où myField correspond superneat, j'ai l'intention d'assurer que myOtherField est réglé sur somethingElse, mais si myField n'est pas superneat, inclure dans les résultats. Est-ce que quelqu'un peut expliquer pourquoi Solr ne retourne pas de résultats pour ce genre de requête? La requête devrait-elle être restructurée d'une manière ou d'une autre - ou y a-t-il une façon différente d'utiliser le solr pour obtenir le résultat souhaité?

Répondre

76

Je ne sais pas pourquoi cela ne fonctionne pas, mais celui-ci est logiquement équivalent et ne travail:

-(myField:superneat AND -myOtherField:somethingElse) 

Peut-être qu'il a quelque chose à voir avec la définition du même champ deux fois dans le requête ...

Essayez de demander dans le solr-user group, puis affichez ici la réponse finale!

+0

Nous vous remercions de votre aide! Cela fonctionne en effet - et j'ai posé cela au groupe solr-utilisateur. Je posterai toutes les choses utiles que j'entends d'eux ici. – stolenricecakes

+8

Notez que '-myField: superneat OU myOtherField: somethingElse' serait également le même et est légèrement plus simple. –

+3

@YorickSijsling le point est que même si logiquement équivalent, Solr parfois ne gère pas très bien avec des requêtes purement négatives comme celle que l'OP posté ou celui que vous avez posté. –

8

Vous trouverez le suivi du groupe solr-utilisateur: solr user mailling list

La pensée dominante est que l'opérateur peut non seulement être utilisé pour supprimer les résultats d'une requête - pas seulement exclure les choses de l'ensemble jeu de données. Il m'arrive d'aimer la syntaxe que vous avez suggérée mausch - merci!

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

Merci beaucoup! Celui-ci a fonctionné pour moi même pour des requêtes complexes tandis que - (myField: superneat ET -monOtherField: somethingElse) approche - n'a pas! – dpetruha

27

Solr vérifie actuellement une requête « négative pure » et insère *:* (qui correspond à tous les documents) pour qu'il fonctionne correctement.

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

La grande mise en garde est que Solr vérifie uniquement pour voir si la requête de niveau supérieur est une requête négative pure! Cela signifie qu'une requête telle que bar OR (-foo) n'est pas modifiée car la requête purement négative se trouve dans une sous-clause de la requête de niveau supérieur. Vous devez transformer cette requête vous 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(*:*)) 
+1

Un merci pour l'explication! –

+1

* edismax * gère correctement les requêtes négatives pures imbriquées, n'est-ce pas? Y a-t-il eu des discussions sur la correction de l'analyseur de requêtes Lucene pour les prendre en charge de la même manière? –

19

Mettant ensemble les commentaires d'un autre couple réponses ici, dans les documents Solr et sur l'autre question SO, j'ai trouvé que la syntaxe suivante produit le résultat correct pour mon cas d'utilisation

(my_field = MY_VALUE ou my_field est nulle):

(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 dans le PO; mais, je pensais que d'autres le trouveraient utile.

+1

Ran exactement dans ce scénario aujourd'hui dans Solr 5, et cette suggestion fonctionne. –

Questions connexes