우리가 사용하는 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;
}