1

Lucene.Net 3.0.3 Whitespace Analyzerを使用し、以下に示すNot_AnalyzedオプションとAnalyzedオプションを使用して、2つのフィールドで区切られた同じ名前のファイルにインデックスを付けます。

        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();




    }

単一行の正規表現を検索する場合は問題ありませんが、複数行の正規表現を検索する場合は、検索ファイルのサイズが16 KBより小さい場合は問題ありませんが、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;

}

4

1 に答える 1

0

IndexWriter.AddDocumentサポートされている用語の最大長は、 およびフィールドのドキュメントによると 16,383 文字IndexWriter.MAX_TERM_LENGTHです。これより長い用語は単に無視され、あなたが説明した問題を引き起こしているようです。

AddDocument のドキュメントでは、例外がスローされると主張していますが、フィールドには、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

于 2012-11-16T08:47:53.653 に答える