2010-07-22 7 views
3

J'essaie une requête Solr qui ressemble à ceAND, OR et NOT dans Solr Recherche

+field1:* AND (field2:1 OR field2:10) NOT(field3:value1 OR field3:value2) 

Mais field3 partie de la requête ne fait aucun impact. Il apporte toujours un enregistrement qui a valeur1 ou valeur2 dans le champ 3

Pourquoi est-ce?

+0

qu'avez-vous l'intention d'interroger avec 'field1: *'? –

+3

Veuillez cocher l'une des réponses acceptées, ou mentionner pourquoi aucune d'entre elles ne correspond à vos besoins. – dotancohen

Répondre

4

Je pense qu'il manque un ET/OU entre les deux derniers blocs. Il deviendrait alors quelque chose comme: symbole

+field1:* AND (field2:1 OR field2:10) AND NOT(field3:value1 OR field3:value2) 
+0

Non, cela n'a pas fonctionné. Toujours le même résultat – Riz

+0

Transmettez-vous cette requête directement dans une URL ou utilisez-vous une API? –

+0

J'essaie dans la zone Solr Admin – Riz

4

Essayez cette

+field1:* +(field2:1 OR field2:10) -(field3:value1 OR field3:value2) 
0

Vous devez urlencode certains caractères dans la requête Solr pour répondre UTF8 normes et + (plus) est l'un d'entre eux , ainsi que l'espace, etc. supports

choses à encode sont:

Space => + 
+ => %2B 
(=> %28 
) => %29 

et ainsi de suite, vous pouvez voir un exemple d'une URL encodée sur le site SOLR: https://wiki.apache.org/solr/SolrQuerySyntax

Essayez:

str_replace(array('+','(',')',' '), array('%2B','%28','%29','+'), '+field1:* (field2:1 field2:10) -(field3:value1 field3:value2)'); 

Cela devrait vous donner:

%2Bfield1:*+%2B%28field2:1+field2:10%29+-%28field3:value1+field3:value2%29 

Si votre défaut L'opération de l'analyseur de requêtes est définie sur OU, puis tout espace entre les champs sera interprété comme un opérateur OR.

Le résultat ci-dessus est loin d'être propre & lisible, mais il est une chaîne UTF8 correctement formaté qui Solr vous oblige à lui passer. Vous remarquerez la différence dès que vous l'exécutez.

Pourquoi str_replace au lieu d'urlencode? Eh bien, vous pouvez utiliser urlencode car il va correctement formater la chaîne en UTF8 mais il peut formater certains composants de chaîne qui n'ont pas besoin d'être codés.

Questions connexes