Erreur WildcardQuery dans Solr
- Je utiliser solr pour la recherche de documents et lorsque vous essayez de rechercher des documents à l'aide de cette requête "id:*
", j'obtiens ce parseur exception dire qu'il ne peut pas analyser la requête avec * ou ? comme premier caractère.
HTTP Status 400 - org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery
type Status report
message org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery
description The request sent by the client was syntactically incorrect (org.apache.lucene.queryParser.ParseException: Cannot parse 'id:*': '*' or '?' not allowed as first character in WildcardQuery).
Est-il un patch pour obtenir que cela fonctionne avec seulement * ? Ou est-elle très coûteux de faire une telle requête?
source d'informationauteur cnu | 2008-08-19
Vous devez vous connecter pour publier un commentaire.
Si vous voulez que tous les documents, faire une requête sur *:*
Si vous voulez que tous les documents avec un certain domaine (par exemple, id) essayez id: [* * ]
Lucene ne vous permet pas de démarrer WildcardQueries avec un astérisque par défaut, parce que ceux-ci sont incroyablement cher des requêtes et sera très, très, très lent sur les grands indices.
Si vous utilisez la Lucene QueryParser, appel setAllowLeadingWildcard(true) sur on pour l'activer.
Si vous voulez que tous les documents avec un certain ensemble sur le terrain, vous êtes beaucoup mieux d'interroger ou de la marche à l'index par programmation de l'aide QueryParser. Vous devriez vraiment utiliser QueryParser pour analyser la saisie de l'utilisateur.
J'ai juste fait cette dans lukeall sur mon index, et il a travaillé, par conséquent, il faut travailler dans Solr qui utilise le standard analyseur de requête. Je n'ai pas vraiment utiliser Solr.
Dans la base de Lucene, il y a une belle raison pour expliquer pourquoi vous ne l'avais jamais requête pour chaque document, c'est parce qu'à la requête pour un document, vous devez utiliser un
new indexReader("DirectoryName")
et d'appliquer une requête. Par conséquent on peut totalement ignorer l'application d'une requête et utiliser l'indexReader
méthodesnumDocs()
d'obtenir un décompte de tous les documents, etdocument(int n)
pour récupérer les documents.Si vous essayez juste d'obtenir tous les documents, Solr prend en charge l' *:* requête. C'est le seul moment où je sais que Solr vous permettra de commencer une requête avec une *. Je suis sûr que vous avez probablement vu ce que la requête par défaut dans le Solr admin de la page.
Si vous essayez de faire une requête plus précise avec un astérisque ( * ) comme premier caractère, comme, disons, id:*456 ensuite l'une des meilleures façons que j'ai vu est à l'indice de champ à deux reprises. Une fois normalement (nom du champ: id), et une fois avec tous les caractères inversés (nom du champ: reverse_id). Ensuite, vous pouvez essentiellement l'id de requête:456 par l'envoi de la requête reverse_id:654 à la place. L'espoir qui fait sens.
Vous pouvez également rechercher les Solr groupe d'utilisateurs de la liste de diffusion à http://www.mail-archive.com/[email protected]/ où des questions de ce genre arriver assez souvent.
Suivantes Solr question est une demande afin d'être en mesure de configurer la valeur par défaut lucene analyseur de requête.
https://issues.apache.org/jira/browse/SOLR-218
Dans ce numéro, vous pouvez trouver la description suivante, comment faire pour "patch" Solr. Cette modification vous permet de faire des requêtes avec un *.
Je ne suis pas sûr si setLowercaseExpandedTerms est nécessaire...
Je suppose avec l'id:* vous êtes juste essayer de correspondre à tous les documents, à droite?
Je n'ai jamais utilisé solr avant, mais dans mon Lucene expérience, lors de l'acquisition de données, nous avons ajouté un champ caché pour chaque document, puis, quand nous avons besoin de renvoyer tous les enregistrements, nous faisons une recherche de la chaîne constante dans ce domaine qui est la même pour chaque enregistrement.
Si vous ne pouvez pas ajouter un champ comme ça dans votre situation, vous pouvez utiliser un RegexQuery avec une regex qui correspondent à tout ce qui pourrait être trouvé dans le champ id.
Edit: en fait de répondre à la question. Je n'ai jamais entendu parler d'un patch à obtenir que cela fonctionne, mais je serais surpris si il pourrait même être faite pour fonctionner raisonnablement bien. Voir cette question pour une raison sans contrainte PrefixQuery peut causer un problème.
En fait, j'ai été en utilisant une solution de contournement pour ce. J'ai ajouter un caractère à l'id, par exemple: A1, A2, etc.
Avec de telles valeurs dans le champ, il est possible de rechercher l'aide de la requête
id:A*
Mais aimerais savoir si une solution existe.