86 votes

à l'aide de OU et PAS dans solr requête

Je suis en train de travailler sur un solr requête similaire à la suivante:

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

Lors de l'exécution de cette, aucun résultat n'est retourné. À l'aide de critères de chaque côté de la OU PAS renvoie les résultats que j'ai attendez - ils sont tout simplement pas de bien travailler ensemble. Dans le cas qui myField correspond superneat, j'ai l'intention également de s'assurer que myOtherField est fixé à somethingElse, mais si myField n'est pas superneat, de l'inclure dans les résultats.

Quelqu'un peut m'expliquer pourquoi solr n'est pas de renvoyer des résultats pour ce genre de requête? Si la requête sera restructuré en quelque sorte - ou est-il une manière différente en ce qui solr peut être utilisé pour obtenir le résultat souhaité?

84voto

Mauricio Scheffer Points 70470

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

-(myField:superneat AND -myOtherField:somethingElse)

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

Essayez de demander dans le solr-groupe d'utilisateurs, puis après, de retour ici, la réponse finale!

35voto

Yonik Points 301

Solr actuellement vérifie, pour un "pur négatif de la requête" et insère *:* (qui correspond à tous les documents) pour qu'il fonctionne correctement.

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

Le gros problème, c'est que Solr ne vérifie pour voir si la requête de niveau est un pur négatif de la requête! Cela signifie donc que la requête comme bar OR (-foo) n'est pas changé depuis la pure négatif requête est exécutée dans un sous-clause de haut niveau de la requête. Vous avez besoin de transformer cette requête en bar OR (*:* -foo)

26voto

RMorrisey Points 3891

Mettre ensemble des commentaires à partir d'un couple de différentes réponses ici, dans le Solr docs et sur l'autre question, 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. C'est légèrement différente de celle du cas d'utilisation dans l'OP, mais je pensais que d'autres pourraient trouver utile.

10voto

stolenricecakes Points 258

Vous pouvez trouver le suivre jusqu'à la solr-groupe d'utilisateurs sur: solr utilisateur mailling liste

La vigueur de la pensée, c'est que le PAS de l'opérateur ne peut être utilisé pour supprimer les résultats d'une requête - et pas seulement d'exclure les choses de l'ensemble du jeu de données. J'aime la syntaxe que vous avez suggéré mausch - merci!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X