lucene.net - 搜索词太短了?

时间:2010-08-04 07:14:10

标签: asp.net lucene.net

你好我有lucene的应用程序,当我搜索的词语如“a”,“a *”,“an”,“an *”,...

抛出错误:

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

提前感谢:&gt;

1 个答案:

答案 0 :(得分:0)

你确定它也只是“a”失败了吗?

对于“a *”和“an *”的情况,这个失败的原因是因为Lucene在前缀搜索中转换该表达式并基本上将其变成一个巨大的“OR”查询索引中定义的术语以“a”(或“an”)开头。因此,如果你有“aardvark”,“鹿茸”,“动物”等,那么“a *”与“aardvark OR antler OR animal OR ...”相同。

Luncene对“OR”查询中可以合并的术语数量有限制,默认情况下它很小(因为太多术语会严重影响性能),如果术语太多,它会抛出您找到BooleanQuery+TooManyClauses例外。

您可能会发现像“x *”或“qr *”这样的查询不会引发异常:这是因为您(可能)没有很多以“x”或“qr”开头的术语

要解决此问题,您可以选择以下几种方法:

  1. 进一步细化查询,只是不允许单字母前缀查询
  2. 首先调用setMaxClauseCount来增加最大子句数(但我会尽量避免这种情况,因为它可能会影响性能,正如我所说)