2010-08-04 4 views
0

Bonjour j'ai une application avec Lucene, quand je suis à la recherche des termes comme "un", "a *", "un", "un *", ...lucene.net - terme de recherche trop court?

une erreur est générée:

Ausnahmedetails: Lucene.Net.Search.BooleanQuery + TooManyClauses: Systemfehler

Quellfehler:

Zeile 130:    
Zeile 131:   Dim searcher As IndexSearcher = New IndexSearcher(rootpath + "\" + index_root) 'Suche auf diesem Verzeichnis 
Zeile 132:   Dim hits As Hits = searcher.Search(query) 
Zeile 133: 
Zeile 134: 

mais des termes qui contient trois ou plusieurs lettres ne jettent pas une erreur.

Je suis vraiment confus à ce sujet.

plus de code:

Public Sub lucene_search(ByVal strSuchbegriff As String) 




     Dim parser As QueryParser 
     Dim query As Query 


     If (check_volltextsuche.Checked = True And check_dateinamensuche.Checked = False) Then 

      parser = New QueryParser("bodytext", analyzer) 'bodytext=typfeld der durchsucht wird 

      Try 
       query = parser.Parse(strSuchbegriff) 

      Catch 

       meldung.Text = "Falsche Verwendung der Suchsyntax" 
       query = parser.Parse("Suchsyntax") 
       ItemsGrid.Visible = False 
       myexception = True 
      End Try 


     ElseIf (check_volltextsuche.Checked = False And check_dateinamensuche.Checked = True) Then 

      parser = New QueryParser("title", analyzer) 

      Try 
       query = parser.Parse(strSuchbegriff) '* um teile danach zu finden --> gesamten filename durchsuchen 
      Catch 

       meldung.Text = "Falsche Verwendung der Suchsyntax" 
       query = parser.Parse("Suchsyntax") 
       ItemsGrid.Visible = False 
       myexception = True 

      End Try 


     Else 



      parser = New MultiFieldQueryParser(New [String]() {"title", "bodytext"}, New StandardAnalyzer()) 


      Try 
       query = parser.Parse(strSuchbegriff) 

      Catch 

       meldung.Text = "Falsche Verwendung der Suchsyntax" 
       query = parser.Parse("Suchsyntax") 
       ItemsGrid.Visible = False 
       myexception = True 
      End Try 





     End If 

     '################ 
     'Do the search ## 
     '################ 

     If myexception = False Then 




      Dim searcher As IndexSearcher = New IndexSearcher(rootpath + "\" + index_root) 'Suche auf diesem Verzeichnis 
      Dim hits As Hits = searcher.Search(query) '<-- ERROR 

merci à l'avance:>

+0

Quelle version de Lucene.NET utilisez-vous? – Manfred

Répondre

0

Êtes-vous sûr que ça ne pour seulement "un" aussi bien? Pour les cas "a *" et "an *", la raison pour laquelle cela échoue parce que Lucene transforme cette expression dans une recherche de préfixe et la transforme fondamentalement en une requête "OU" géante avec tous les termes définis dans l'index qui commence par "a" (ou "an"). Donc, si vous avez "aardvark", "antler", "animal", etc, alors "a *" est le même que "aardvark OU bois ou animal OU ..."

Luncene a également une limite sur le nombre de termes que vous pouvez combiner dans une requête "OR", par défaut c'est assez petit (parce que trop de termes peuvent sérieusement affecter les performances) et s'il y a trop de termes, il lancera l'exception BooleanQuery+TooManyClauses que vous avez trouvée. Vous trouverez probablement qu'une requête comme "x *" ou "qr *" ne lance pas d'exception: c'est parce que vous n'avez (probablement) pas beaucoup de termes commençant par "x" ou "qr" ".

Pour résoudre le problème, vous avez deux options:

  1. Affiner la recherche plus loin, ne permettent tout simplement pas le préfixe unique lettre requêtes
  2. augmenter le nombre de clause maximale en appelant setMaxClauseCount premier (I J'essaierais d'éviter cela, car cela peut affecter les performances comme je l'ai dit)
+0

merci beaucoup, maintenant je comprends. vous l'avez très bien expliqué! – tim

+0

J'ai essayé "x" ou "qr *" etc et vous avez raison. comment est-ce que je mets ce maxclausecount? appelle juste la méthode? où? ^^ est là un exemple quelque part, ne pouvait pas trouver un:> – tim

+0

C'est une méthode statique sur la classe 'BooleanQuery', vous devriez juste pouvoir dire' BooleanQuery.setMaxClauseCount (10000) '(ou autre). –

Questions connexes