2010-08-04 99 views
0

你好,我有Lucene的應用程序,當我在尋找像 「A」, 「A *」, 「一」, 「一個*」,術語...lucene.net - 搜索詞太短?

拋出一個錯誤:

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: 

但包含三個或多個字母條款不拋出異常。

我真的很困惑。

更多的代碼:

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 

在此先感謝:>

+0

你使用的是什麼版本的Lucene.NET? – Manfred 2010-08-04 07:20:33

回答

0

你確定它的失敗只是 「一」 呢?

對於「A *」和「一個*」的情況下,這將失敗,因爲Lucene的轉向,在一個前綴搜索表達,基本上把它變成一個巨大的「OR」查詢所有中定義的術語的原因以「a」(或「an」)開頭的索引。因此,如果你有「aardvark」,「鹿角」,「動物」等,那麼「a *」與「土豚或鹿角或動物或...」相同。

Luncene對數量也有限制您可以在「OR」查詢中合併的術語,默認情況下它很小(因爲太多的術語會嚴重影響性能),並且如果術語太多,它會拋出您找到的BooleanQuery+TooManyClauses例外。

您可能會發現像「x *」或「qr *」這樣的查詢不會引發異常:這是因爲您(可能)沒有以「x」或「qr 」。

要解決,你有兩個選擇問題:

  1. 進一步細化查詢,根本不允許單字母前綴查詢
  2. 通過調用setMaxClauseCount第一(我增加最大條款計數儘管如此,因爲它會影響性能,如我所說)
+0

非常感謝,現在我明白了。你解釋得很好! – tim 2010-08-04 07:34:07

+0

我試過「x」或「qr *」等等,你說得對。 我如何設置此maxclausecount?只是調用方法?在哪裏?^^ 有沒有一個例子,找不到:> – tim 2010-08-04 08:11:26

+0

這是一個'BooleanQuery'類的靜態方法,你應該只能說'BooleanQuery.setMaxClauseCount(10000)'(或其他)。 – 2010-08-04 12:37:41