2012-11-12 2 views
1

우리가 사용하는 Lucene.Net 3.0.3 공백 분석기와 같은 이름의 파일이 우리가 볼 때Lucene.Net 여러 줄 정규식 검색

 public static void WriteIndexes() 
    { 
     string indexPathRegex = ConfigurationManager.TfSettings.Application.CustomSettings["dbScritpsAddressRegex"]; 

     var analyzerRegex = new WhitespaceAnalyzer(); 
     var indexWriterRegex = new IndexWriter(indexPathRegex, analyzerRegex, IndexWriter.MaxFieldLength.UNLIMITED); 

     foreach (LuceneIndex l in Indexes) 
     { 
      var doc = new Document(); 
      doc.Add(new Field("ServerName", l.ServerName.ToLowerInvariant(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO)); 

      doc.Add(new Field("DatabaseName", l.DatabaseName.ToLowerInvariant(), Field.Store.YES, Field.Index.ANALYZED,Field.TermVector.NO)); 
      doc.Add(new Field("SchemaName", l.SchemaName.ToLowerInvariant(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO)); 
      doc.Add(new Field("ObjectType", l.ObjectType.ToLowerInvariant(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO)); 
      doc.Add(new Field("ObjectName", l.ObjectName.ToLowerInvariant(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO)); 
      doc.Add(new Field("Script", l.Script, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO)); 
      doc.Add(new Field("Script", l.Script, Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.NO)); 

      indexWriterRegex.AddDocument(doc); 
     } 
     indexWriterRegex.Optimize(); 
     analyzerRegex.Close(); 
     indexWriterRegex.Close(); 




    } 

아래와 같이 두 Not_Analyzed 필드 및 분석 옵션을 분리 우리는 인덱스 한 줄의 정규 표현식은 괜찮습니다. 그러나 여러 줄의 정규 표현식을 찾을 때 검색 파일의 크기가 16KB보다 작 으면 괜찮습니다.하지만 16KB보다 클 때 Lucene은 검색 키워드를 찾지 않습니다. 이거 버그 야? 어떻게 해결할 수 있을까요?

샘플 키워드 : .*taxId.*\n.*customerNo.*

 public List<item> SearchAllScriptInIndex() 
    { 
     string indexPathRegex = ConfigurationManager.TfSettings.Application.CustomSettings["dbScritpsAddressRegex"]; 
     var searcher = new Lucene.Net.Search.IndexSearcher(indexPathRegex, false); 

     const int hitsLimit = 1000000; 
     var analyzer = new WhitespaceAnalyzer(); 

     var parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new[] { "Script", "DatabaseName", "ObjectType", "ServerName" }, analyzer); 

     Term t = new Term("Script", Expression); 
     RegexQuery scriptQuery = new RegexQuery(t); 

     string s = string.Format("({0}) AND {1}", serverAndDatabasescript, objectTypeScript); 
     var query = parser.Parse(s); 

     BooleanQuery booleanQuery = new BooleanQuery(); 
     booleanQuery.Add(query, BooleanClause.Occur.MUST); 
     booleanQuery.Add(scriptQuery, BooleanClause.Occur.MUST); 

     var hits = searcher.Search(booleanQuery, null, hitsLimit, Sort.RELEVANCE).ScoreDocs; 

     List<item> results = new List<item>(); 
     List<string> values = new List<string>(); 
     Dictionary<int, string> newLineIndices = new Dictionary<int, string>(); 
     foreach (var hit in hits) 
     { 
      var hitDocument = searcher.Doc(hit.Doc); 
      string contentValue = hitDocument.Get("Script"); 
     LuceneIndex item = new LuceneIndex(); 
     item.ServerName = hitDocument.Get("ServerName"); 
      item.DatabaseName = hitDocument.Get("DatabaseName"); 
      item.ObjectName = hitDocument.Get("ObjectName"); 
      item.ObjectType = hitDocument.Get("ObjectType"); 
      item.SchemaName = hitDocument.Get("SchemaName"); 
      item.Script = hitDocument.Get("Script"); 
        results.Add(item); 

     } 
     return results; 

}

답변

0

지원되는 최대 기간 길이 IndexWriter.AddDocument 설명서에 따라 16 개 개의 문자 (383), 및 필드 IndexWriter.MAX_TERM_LENGTH이다. 이보다 긴 단어는 무시되며 문제가 발생합니다.

AddDocument에 대한 설명서에는 예외가 throw되는 반면 필드에는 해당 정보가 infoStream [있는 경우]에 기록된다는 내용이 나와 있습니다.

/// <p/>Note that each term in the document can be no longer 
/// than 16383 characters, otherwise an 
/// IllegalArgumentException will be thrown.<p/> 

// [...] 

/// <summary> Absolute hard maximum length for a term. If a term 
/// arrives from the analyzer longer than this length, it 
/// is skipped and a message is printed to infoStream, if 
/// set (see <see cref="SetInfoStream" />). 
/// </summary> 
public static readonly int MAX_TERM_LENGTH; 

출처 : IndexWriter.cs