à 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é?
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas pourquoi cela ne fonctionne pas, mais celui-ci est logiquement équivalent et il ne travail:
Peut-être qu'il a quelque chose à voir avec la définition d'un même champ deux fois dans la requête...
Essayer de demander dans le solr-groupe d'utilisateurs, puis après, de retour ici, la réponse finale!
-myField:superneat OR myOtherField:somethingElse
serait également le même et est légèrement plus simple.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 dans(*:* -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 vous-même dansbar OR (*:* -foo)
Vous pouvez vérifier l'solr requête explication pour vérifier la requête de transformation:
est transformé à
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):
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.
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!
Juste pour ajouter un autre inattendu cas, voici la requête qui n'était pas de retour résultats attendus:
field_b
dans mon cas, c'est quelque chose que j'ai effectuer la recherche à facettes, et à cibler le terme de la requête "foo" seulement sur ce type (bar)J'ai eu insérer un autre
*:*
après la condition ou à obtenir que cela fonctionne, comme suit:edit: c'est dans solr 6.6.3