2010-01-17 8 views
4

Pourquoi la requête générique "dog # V *" ne parvient-elle pas à récupérer un document contenant "dog # VVP"?Caractères génériques dans Lucene

Le code suivant écrit en Jython pour Lucene 3.0.0 ne parvient pas à récupérer le document indexé. Est-ce que je manque quelque chose?

analyzer = WhitespaceAnalyzer() 
directory = FSDirectory.open(java.io.File("testindex")) 
iwriter = IndexWriter(directory, analyzer, True, IndexWriter.MaxFieldLength(25000)) 

doc = Document() 
doc.add(Field("sentence", "dog#VVP", Field.Store.YES, Field.Index.ANALYZED)) 
iwriter.addDocument(doc) 
iwriter.close() 
directory.close() 

parser = QueryParser(Version.LUCENE_CURRENT, "sentence", analyzer) 
directory = FSDirectory.open(java.io.File("testindex")) 
isearcher = IndexSearcher(directory, True) # read-only=true 

query = parser.parse("dog#V*") 
hits = isearcher.search(query, None, 10).scoreDocs 
print query_text + ":" + ", ".join([str(x) for x in list(hits)]) 

sortie est:

dog#V*: 

Il ne retourne rien. Je vois le même comportement pour le chien # VV * ou avec des caractères séparateurs autres que "#" (j'ai essayé "__" et "aaa"). Fait intéressant, les requêtes suivantes fonctionnent: chien # ???, chien # *.

Répondre

3

Si vous regardiez attentivement le résultat de

parser.parse("dog#V*") 

vous auriez vu

sentence:dog#v* 

Notez le v minuscule! Pour éviter l'automatique des termes en minuscules dans une requête générique, vous devrez faire

parser.setLowercaseExpandedTerms(False) 

avant l'analyse des chaînes de requête. Je n'ai aucune idée pourquoi la valeur par défaut est en minuscules.

+0

Merci! Cela résout mon problème actuel. Pour autant que je sache, LowerCase est juste un autre filtre dans WhitespaceAnalysis. Je vais essayer de voir ce qui se passe si j'utilise ma propre classe d'analyse personnalisée (qui utilisera un turboLowerCase), mais y a-t-il quelqu'un qui pourrait expliquer le mécanisme et la logique derrière ce défaut? –

+2

@ Amaç - Notez que les minuscules ne font PAS partie de WhiteSpaceAnalyzer, mais plutôt un comportement par défaut de l'analyseur de requête. Par conséquent, si vous souhaitez modifier les minuscules, vous devez soit définir l'indicateur comme suggéré par Jonathan, soit écrire votre propre classe d'analyseur de requête. –

+0

Et le commentaire de Yuval corrige mon malentendu à propos du comportement en minuscules. Tout est clair maintenant, merci encore. –

Questions connexes