Ejemplo n.º 1
0
        static void Proc()
        {
            var uri = GetRandomWikiPage();
            queue.Enqueue(uri);
            using (var dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo("..\\..\\idx"))) {
                using (var indexWriter = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30), new IndexWriter.MaxFieldLength(IndexWriter.DEFAULT_MAX_FIELD_LENGTH))) {
                    while (true) {
                        string page;

                        if (queue.TryDequeue(out page)) {
                            visited.AddOrUpdate(page, true, (p, b) => true);
                            try {
                                ProcessPage(page, indexWriter);
                            }
                            catch (Exception) {
                                Console.WriteLine("ERROR");
                            }
                            if (Console.KeyAvailable) {
                                var x = Console.ReadKey();
                                if (x.Key == ConsoleKey.Spacebar) {

                                    break;
                                }
                            }
                        }
                        else {
                            break;
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public ExamineTestSetupHelper(FakeFrameworkContext frameworkContext = null, bool isPassthrough = false)
        {
            var examineWorkingFolder = new DirectoryInfo(Path.Combine(Common.CurrentAssemblyDirectory, "Examine", Guid.NewGuid().ToString() + Thread.CurrentThread.ManagedThreadId));
            if (!examineWorkingFolder.Exists)
                Directory.CreateDirectory(examineWorkingFolder.FullName);

            //clear out old folders
            var parentFolder = examineWorkingFolder.Parent;
            foreach(var f in parentFolder.GetDirectories().Where(x => x.CreationTimeUtc < DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(5))))
            {
                try
                {
                    Directory.Delete(f.FullName, true);
                }
                catch (IOException)
                {
                    //ignore
                }
            }

            LogHelper.TraceIfEnabled<ExamineTestSetupHelper>("Index setup in folder {0}", () => examineWorkingFolder.FullName);

            //var disk = new Lucene.Net.Store.RAMDirectory();
            var disk = new Lucene.Net.Store.SimpleFSDirectory(examineWorkingFolder);

            Indexer = new RebelExamineIndexer(
                new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),
                SynchronizationType.Synchronized,
                disk);

            _fakeFrameworkContext = frameworkContext ?? new FakeFrameworkContext();
            

            Searcher = new LuceneSearcher(new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), disk);
            ExamineManager = new ExamineManager(new[] { Searcher }, new[] { Indexer }, Searcher);
            ExamineHelper = new ExamineHelper(ExamineManager, _fakeFrameworkContext, false); //false to not use cache

            var examineMapper = new ExamineModelMapper(ExamineHelper, _fakeFrameworkContext);
            _fakeFrameworkContext.SetTypeMappers(new FakeTypeMapperCollection(new AbstractMappingEngine[] { examineMapper, new FrameworkModelMapper(_fakeFrameworkContext) }));

            var providerMetadata = new ProviderMetadata("r-examine-unit-tester", new Uri("tester://"), true, isPassthrough);
 
            var revisionSchemaSessionFactory = new NullProviderRevisionRepositoryFactory<EntitySchema>(providerMetadata, FrameworkContext);
            var revisionRepositoryFactory = new RevisionRepositoryFactory(providerMetadata, FrameworkContext, ExamineHelper);
            //var revisionRepositoryFactory = new NullProviderRevisionSessionFactory<TypedEntity>(providerMetadata, FrameworkContext);
            var schemaRepositoryFactory = new SchemaRepositoryFactory(providerMetadata, revisionSchemaSessionFactory, FrameworkContext, ExamineHelper);
            var entityRepositoryFactory = new EntityRepositoryFactory(providerMetadata, revisionRepositoryFactory, schemaRepositoryFactory, FrameworkContext, ExamineHelper);

            var readUnitFactory = new ReadonlyProviderUnitFactory(entityRepositoryFactory);
            var unitFactory = new ProviderUnitFactory(entityRepositoryFactory);

            ProviderSetup = new ProviderSetup(unitFactory, providerMetadata, FrameworkContext, null, 0);
            ReadonlyProviderSetup = new ReadonlyProviderSetup(readUnitFactory, providerMetadata, FrameworkContext, null, 0);

            //ensure that the index exists
            Indexer.CreateIndex(true);
        }
Ejemplo n.º 3
0
        private static void EnsureIndexWriterCore(bool creatingIndex)
        {
            if (!Directory.Exists(LuceneCommon.IndexDirectory))
            {
                Directory.CreateDirectory(LuceneCommon.IndexDirectory);
            }

            var analyzer = new StandardAnalyzer(LuceneCommon.LuceneVersion);
            var directoryInfo = new DirectoryInfo(LuceneCommon.IndexDirectory);
            var directory = new Lucene.Net.Store.SimpleFSDirectory(directoryInfo);
            indexWriter = new IndexWriter(directory, analyzer, create: creatingIndex, mfl: IndexWriter.MaxFieldLength.UNLIMITED);
        }
Ejemplo n.º 4
0
 public void TestFSDirectorySync()
 {
     System.IO.DirectoryInfo path = new System.IO.DirectoryInfo(System.IO.Path.Combine(AppSettings.Get("tempDir", ""), "testsync"));
     Lucene.Net.Store.Directory directory = new Lucene.Net.Store.SimpleFSDirectory(path, null);
     try
     {
         Lucene.Net.Store.IndexOutput io = directory.CreateOutput("syncfile");
         io.Close();
         directory.Sync("syncfile");
     }
     finally
     {
         directory.Close();
         Lucene.Net.Util._TestUtil.RmDir(path);
     }
 }
Ejemplo n.º 5
0
 public void TestFSDirectorySync()
 {
     System.IO.DirectoryInfo    path      = new System.IO.DirectoryInfo(System.IO.Path.Combine(AppSettings.Get("tempDir", ""), "testsync"));
     Lucene.Net.Store.Directory directory = new Lucene.Net.Store.SimpleFSDirectory(path, null);
     try
     {
         Lucene.Net.Store.IndexOutput io = directory.CreateOutput("syncfile", null);
         io.Close();
         directory.Sync("syncfile");
     }
     finally
     {
         directory.Close();
         Lucene.Net.Util._TestUtil.RmDir(path);
     }
 }
Ejemplo n.º 6
0
        public void TestFSDirectorySync()
        {
            DirectoryInfo path = new DirectoryInfo(Path.Combine(Path.GetTempPath(), "testsync"));

            Lucene.Net.Store.Directory directory = new Lucene.Net.Store.SimpleFSDirectory(path, null);
            try
            {
                Lucene.Net.Store.IndexOutput io = directory.CreateOutput("syncfile", new Store.IOContext());
                io.Dispose();
                directory.Sync(new string[] { "syncfile" });
            }
            finally
            {
                directory.Dispose();
                Lucene.Net.Util.TestUtil.Rm(path);
            }
        }
Ejemplo n.º 7
0
        public override CardDescription[] Read(string dirname, ReadProcessChangedInvoker processchanged)
        {
            if (dirname == null || dirname.Length <= 0)
            {
                return(null);
            }

            if (!Directory.Exists(dirname))
            {
                return(null);
            }

            if (dirname[dirname.Length - 1] != '\\')
            {
                dirname += "\\";
            }

            ArrayList cards = new ArrayList(MinCapacity);
            Query     query = new MatchAllDocsQuery();

            Lucene.Net.Store.Directory dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(dirname), new Lucene.Net.Store.SimpleFSLockFactory());
            Searcher searcher = new IndexSearcher(dir, true);

            TopDocs td = searcher.Search(query, null, searcher.MaxDoc());

            ScoreDoc[] docs = td.scoreDocs;

            int length = docs.Length;

            for (int i = 0; i < length; i++)
            {
                Document doc = searcher.Doc(docs[i].doc);
                cards.Add(ParseCard(doc));
                if (processchanged != null)
                {
                    processchanged.Invoke(length, i + 1);
                }
            }

            searcher.Close();

            return((CardDescription[])cards.ToArray(typeof(CardDescription)));
        }
Ejemplo n.º 8
0
 protected void deleteIndex(string path, string id)
 {
     string Indexdic_Server = IndexDic(path);
     IndexWriter writer = null;
     Lucene.Net.Store.Directory dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(Indexdic_Server));
     try
     {
         //writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, false, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
         writer = new IndexWriter(dir, PanGuAnalyzer, false, IndexWriter.MaxFieldLength.LIMITED);
     }
     catch
     {
         //writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
         writer = new IndexWriter(dir, PanGuAnalyzer, true, IndexWriter.MaxFieldLength.LIMITED);
     }
     writer.DeleteDocuments(new Term("NumId", id));//删除一条索引
     writer.Optimize();
     writer.Close();
 }
Ejemplo n.º 9
0
        /// <summary>
        /// 创建索引
        /// </summary>
        private void CreateIndex(内容基本数据 model, string indexdic)
        {
            string Indexdic_Server = IndexDic(indexdic);

            PanGu.Segment.Init(PanGuXmlPath);
            //var g = model as Go81WebApp.Models.数据模型.内容数据模型.公告;
            //创建索引目录
            if (!Directory.Exists(Indexdic_Server))
            {
                Directory.CreateDirectory(Indexdic_Server);
            }

            Lucene.Net.Store.Directory dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(Indexdic_Server));
            //IndexWriter第三个参数:true指重新创建索引,false指从当前索引追加....此处为追加索引所以为false
            try
            {
                IndexWriter writer = new IndexWriter(dir, PanGuAnalyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
                //IndexWriter writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, false, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
                AddIndex(writer, model.Id.ToString(), model.内容主体.标题, model.内容主体.内容, model.内容主体.发布时间.ToString());

                writer.Optimize();
                writer.Close();
            }
            catch
            {
                IndexWriter writer = new IndexWriter(dir, PanGuAnalyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
                //IndexWriter writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
                AddIndex(writer, model.Id.ToString(), model.内容主体.标题, model.内容主体.内容, model.内容主体.发布时间.ToString());

                writer.Optimize();
                writer.Close();
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 创建公告索引
        /// </summary>
        private void GG_CreateIndex(公告 g, string indexdic)
        {
            string Indexdic_Server = IndexDic(indexdic);

            PanGu.Segment.Init(PanGuXmlPath);
            //创建索引目录
            if (!Directory.Exists(Indexdic_Server))
            {
                Directory.CreateDirectory(Indexdic_Server);
            }

            Lucene.Net.Store.Directory dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(Indexdic_Server));

            //IndexWriter第三个参数:true指重新创建索引,false指从当前索引追加....此处为追加索引所以为false
            try
            {
                IndexWriter writer = new IndexWriter(dir, PanGuAnalyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
                //IndexWriter writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, false, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
                GG_AddIndex(writer, g);

                writer.Optimize();
                writer.Close();
            }
            catch
            {
                IndexWriter writer = new IndexWriter(dir, PanGuAnalyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
                //IndexWriter writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
                GG_AddIndex(writer, g);

                writer.Optimize();
                writer.Close();
            }
        }
Ejemplo n.º 11
0
        private static void RebuildSiteIndex(
            string indexPath,
            IEnumerable<PageSettings> menuPages)
        {
            if (WebConfigSettings.DisableSearchIndex) { return; }

            // clean out index entirely

            using (Lucene.Net.Store.SimpleFSDirectory d = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(indexPath)))
            {

                if (IndexReader.IndexExists(d))
                {

                    using (IndexReader reader = IndexReader.Open(d, false))
                    {

                        for (int i = 0; i < reader.NumDocs(); i++)
                        {
                            reader.DeleteDocument(i);
                        }

                    }

                }

            }

            log.Info("Rebuilding Search index.");

            if (IndexBuilderManager.Providers == null)
            {
                log.Info("No IndexBuilderProviders found");
                return;
            }

            // forums can potentially take  long time to index
            // and possibly even time out so index forums after everything else
            foreach (PageSettings pageSettings in menuPages)
            {
                foreach (IndexBuilderProvider indexBuilder in IndexBuilderManager.Providers)
                {
                    if (indexBuilder.Name != "ForumThreadIndexBuilderProvider")
                    {
                        indexBuilder.RebuildIndex(pageSettings, indexPath);
                    }
                }

            }

            log.Info("Finished indexing main features.");

            // now that other modules are done index forums
            foreach (PageSettings pageSettings in menuPages)
            {
                foreach (IndexBuilderProvider indexBuilder in IndexBuilderManager.Providers)
                {
                    if (indexBuilder.Name == "ForumThreadIndexBuilderProvider")
                    {
                        indexBuilder.RebuildIndex(pageSettings, indexPath);
                    }
                }

            }

            log.Info("Finished indexing Forums.");

            return;
        }
        public ExamineTestSetupHelper(FakeFrameworkContext frameworkContext = null, bool isPassthrough = false)
        {
            var examineWorkingFolder = new DirectoryInfo(Path.Combine(Common.CurrentAssemblyDirectory, "Examine", Guid.NewGuid().ToString() + Thread.CurrentThread.ManagedThreadId));

            if (!examineWorkingFolder.Exists)
            {
                Directory.CreateDirectory(examineWorkingFolder.FullName);
            }

            //clear out old folders
            var parentFolder = examineWorkingFolder.Parent;

            foreach (var f in parentFolder.GetDirectories().Where(x => x.CreationTimeUtc < DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(5))))
            {
                try
                {
                    Directory.Delete(f.FullName, true);
                }
                catch (IOException)
                {
                    //ignore
                }
            }

            LogHelper.TraceIfEnabled <ExamineTestSetupHelper>("Index setup in folder {0}", () => examineWorkingFolder.FullName);

            //var disk = new Lucene.Net.Store.RAMDirectory();
            var disk = new Lucene.Net.Store.SimpleFSDirectory(examineWorkingFolder);

            Indexer = new UmbracoExamineIndexer(
                new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29),
                SynchronizationType.Synchronized,
                disk);

            _fakeFrameworkContext = frameworkContext ?? new FakeFrameworkContext();


            Searcher       = new LuceneSearcher(new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), disk);
            ExamineManager = new ExamineManager(new[] { Searcher }, new[] { Indexer }, Searcher);
            ExamineHelper  = new ExamineHelper(ExamineManager, _fakeFrameworkContext, false); //false to not use cache

            var examineMapper = new ExamineModelMapper(ExamineHelper, _fakeFrameworkContext);

            _fakeFrameworkContext.SetTypeMappers(new FakeTypeMapperCollection(new AbstractMappingEngine[] { examineMapper, new FrameworkModelMapper(_fakeFrameworkContext) }));

            var providerMetadata = new ProviderMetadata("r-examine-unit-tester", new Uri("tester://"), true, isPassthrough);

            var revisionSchemaSessionFactory = new NullProviderRevisionRepositoryFactory <EntitySchema>(providerMetadata, FrameworkContext);
            var revisionRepositoryFactory    = new RevisionRepositoryFactory(providerMetadata, FrameworkContext, ExamineHelper);
            //var revisionRepositoryFactory = new NullProviderRevisionSessionFactory<TypedEntity>(providerMetadata, FrameworkContext);
            var schemaRepositoryFactory = new SchemaRepositoryFactory(providerMetadata, revisionSchemaSessionFactory, FrameworkContext, ExamineHelper);
            var entityRepositoryFactory = new EntityRepositoryFactory(providerMetadata, revisionRepositoryFactory, schemaRepositoryFactory, FrameworkContext, ExamineHelper);

            var readUnitFactory = new ReadonlyProviderUnitFactory(entityRepositoryFactory);
            var unitFactory     = new ProviderUnitFactory(entityRepositoryFactory);

            ProviderSetup         = new ProviderSetup(unitFactory, providerMetadata, FrameworkContext, null, 0);
            ReadonlyProviderSetup = new ReadonlyProviderSetup(readUnitFactory, providerMetadata, FrameworkContext, null, 0);

            //ensure that the index exists
            Indexer.CreateIndex(true);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// 创建商品分类索引--用于搜索框智能提示
        /// </summary>
        public static void CreateIndex_ProductCatalog(string catalogName, string indexdic)
        {
            string Indexdic_Server = IndexDic(indexdic);

            PanGu.Segment.Init(PanGuXmlPath);
            //创建索引目录
            if (!Directory.Exists(Indexdic_Server))
            {
                Directory.CreateDirectory(Indexdic_Server);
            }
            Lucene.Net.Store.Directory dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(Indexdic_Server));
            //IndexWriter第三个参数:true指重新创建索引,false指从当前索引追加....此处为追加索引所以为false
            try
            {
                //IndexWriter writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, false, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
                IndexWriter writer = new IndexWriter(dir, PanGuAnalyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
                AddIndex_ProductCatalog(writer, catalogName);

                writer.Optimize();
                writer.Close();
            }
            catch
            {
                //IndexWriter writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
                IndexWriter writer = new IndexWriter(dir, PanGuAnalyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
                AddIndex_ProductCatalog(writer, catalogName);

                writer.Optimize();
                writer.Close();
            }

        }
Ejemplo n.º 14
0
        /// <summary>
        /// 创建供应商索引
        /// </summary>
        /// <param name="model"></param>
        /// <param name="indexdic"></param>
        public static void CreateIndex_gys(供应商 model, string indexdic)
        {
            string Indexdic_Server = IndexDic(indexdic);

            PanGu.Segment.Init(PanGuXmlPath);
            //创建索引目录
            if (!Directory.Exists(Indexdic_Server))
            {
                Directory.CreateDirectory(Indexdic_Server);
            }
            Lucene.Net.Store.Directory dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(Indexdic_Server));
            //IndexWriter第三个参数:true指重新创建索引,false指从当前索引追加....此处为追加索引所以为false
            try
            {
                //Lucene.Net.Store.FSDirectory directory = Lucene.Net.Store.FSDirectory.Open(new DirectoryInfo("/Lucene.Net/IndexDic/Gys"), new Lucene.Net.Store.NativeFSLockFactory());
                //bool isUpdate = IndexReader.IndexExists(directory);


                //IndexWriter writer = new IndexWriter(directory, PanGuAnalyzer, isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
                //AddIndex_gys(writer, model);
                //IndexWriter writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, false, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);

                IndexWriter writer = new IndexWriter(dir, PanGuAnalyzer, false, IndexWriter.MaxFieldLength.UNLIMITED);
                AddIndex_gys(writer, model);

                writer.Optimize();
                writer.Close();
            }
            catch
            {
                //IndexWriter writer = new IndexWriter(Indexdic_Server, PanGuAnalyzer, true, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
                IndexWriter writer = new IndexWriter(dir, PanGuAnalyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
                AddIndex_gys(writer, model);

                writer.Optimize();
                writer.Close();
            }


            //string Indexdic_Server = IndexDic(indexdic);

            //PanGu.Segment.Init(PanGuXmlPath);
            ////创建索引目录
            //Lucene.Net.Store.FSDirectory directory = Lucene.Net.Store.FSDirectory.Open(new DirectoryInfo(Indexdic_Server), new Lucene.Net.Store.NativeFSLockFactory());
            //bool isUpdate = IndexReader.IndexExists(directory);

            //IndexWriter writer = new IndexWriter(directory, PanGuAnalyzer, isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
            //AddIndex_gys(writer, model);

            //writer.Optimize();
            //writer.Close();

        }
Ejemplo n.º 15
0
        static void Search()
        {
            using (var dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo("..\\..\\idx"))) {
                var searcher = new IndexSearcher(dir);

                Console.WriteLine(searcher.MaxDoc);

                var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "content", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30));
                while (true) {
                    var term = Console.ReadLine();
                    var sw = Stopwatch.StartNew();
                    if (term == "") return;
                    var query = parser.Parse(term);
                    var col = TopScoreDocCollector.Create(10, true);
                    searcher.Search(query, col);
                    var hits = col.TopDocs().ScoreDocs;
                    sw.Stop();
                    Console.WriteLine(sw.Elapsed.ToString());
                    for (int i = 0; i < hits.Length; i++) {
                        var doc = searcher.Doc(hits[i].Doc);
                        var name = doc.GetField("name").StringValue;
                        var idx = doc.GetField("idx")?.StringValue;
                        Console.WriteLine(" " + name + " " + idx);
                    }
                }
            }
        }
Ejemplo n.º 16
0
        private static void EnsureIndexWriter(bool creatingIndex)
        {
            if (!Directory.Exists(LuceneCommon.IndexDirectory))
            {
                Directory.CreateDirectory(LuceneCommon.IndexDirectory);
            }

            if (indexWriter == null)
            {
                lock (indexLock)
                {
                    if (indexWriter == null)
                    {
                        var analyzer = new StandardAnalyzer(LuceneCommon.LuceneVersion);
                        var directory = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(LuceneCommon.IndexDirectory));
                        indexWriter = new IndexWriter(directory, analyzer, create: creatingIndex, mfl: IndexWriter.MaxFieldLength.UNLIMITED);
                    }
                }
            }
        }
Ejemplo n.º 17
0
        public virtual void Save(string dirname, CardDescription[] cards, SaveProcessChangedInvoker processchanged)
        {
            if (dirname == null || dirname.Length <= 0)
            {
                return;
            }

            if (!Directory.Exists(dirname))
            {
                Directory.CreateDirectory(dirname);
            }

            Lucene.Net.Store.Directory dir = new Lucene.Net.Store.SimpleFSDirectory(new DirectoryInfo(dirname), new Lucene.Net.Store.SimpleFSLockFactory());
            IndexWriter writer             = new IndexWriter(dir, AnalyzerFactory.GetAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);

            writer.SetMaxBufferedDocs(100);
            writer.SetMergeFactor(100);


//========================================卡片种类映射表====================================
//
//	         通常  普通  速攻  装备  仪式  场地  反击  永续  效果  融合  同调  XYZ
// 1、怪兽	  0     0                 3                       4     5     6     7
// 2、魔法	  0     0     1     2     3     4           5
// 3、陷阱	  0     0                             1     5
//
//==========================================================================================

            for (int i = 0; i < cards.Length; i++)
            {
                CardDescription card = cards[i];
                int             ict  = 0;
                if (card.sCardType.Length > 0)
                {
                    switch (card.sCardType.Substring(card.sCardType.Length - 2, 2))
                    {
                    case "怪兽":
                        ict = 1;
                        break;

                    case "魔法":
                        ict = 2;
                        break;

                    case "陷阱":
                        ict = 3;
                        break;

                    default:
                        ict = 4;
                        break;
                    }
                    ict *= 10;

                    switch (card.sCardType.Substring(0, 2))
                    {
                    case "通常":
                        ict += 0;
                        break;

                    case "普通":
                        ict += 0;
                        break;

                    case "速攻":
                        ict += 1;
                        break;

                    case "装备":
                        ict += 2;
                        break;

                    case "仪式":
                        ict += 3;
                        break;

                    case "场地":
                        ict += 4;
                        break;

                    case "反击":
                        ict += 1;
                        break;

                    case "永续":
                        ict += 5;
                        break;

                    case "效果":
                        ict += 4;
                        break;

                    case "融合":
                        ict += 5;
                        break;

                    case "同调":
                        ict += 6;
                        break;

                    case "XY":
                        ict += 7;
                        break;

                    default:
                        ict += 9;
                        break;
                    }
                }


                Document doc = new Document();

                Field ID         = new Field("ID", card.ID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED);
                Field name       = new Field("name", card.name, Field.Store.YES, Field.Index.ANALYZED);
                Field name2      = new Field("name2", card.name, Field.Store.NO, Field.Index.NOT_ANALYZED);
                Field japName    = new Field("japName", card.japName, Field.Store.YES, Field.Index.ANALYZED);
                Field japName2   = new Field("japName2", card.japName, Field.Store.NO, Field.Index.NOT_ANALYZED);
                Field enName     = new Field("enName", card.enName, Field.Store.YES, Field.Index.ANALYZED);
                Field enName2    = new Field("enName2", card.enName, Field.Store.NO, Field.Index.NOT_ANALYZED);
                Field oldName    = new Field("oldName", card.oldName.Replace(",", " 龴 "), Field.Store.NO, Field.Index.ANALYZED);
                Field shortName  = new Field("shortName", card.shortName.Replace(",", " 龴 "), Field.Store.NO, Field.Index.ANALYZED);
                Field oldName2   = new Field("oldName2", card.oldName, Field.Store.YES, Field.Index.NOT_ANALYZED);
                Field shortName2 = new Field("shortName2", card.shortName, Field.Store.YES, Field.Index.NOT_ANALYZED);

                Field pyname      = new Field("pyname", GetPingyin.convertline(card.name), Field.Store.NO, Field.Index.ANALYZED);
                Field pyoldName   = new Field("pyoldName", GetPingyin.convertline(card.oldName), Field.Store.NO, Field.Index.ANALYZED);
                Field pyshortName = new Field("pyshortName", GetPingyin.convertline(card.shortName), Field.Store.NO, Field.Index.ANALYZED);

                Field cardType    = new Field("cardType", card.sCardType, Field.Store.YES, Field.Index.ANALYZED);
                Field cardType2   = new Field("cardType2", ict.ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED);
                Field effectType  = new Field("effectType", card.effectType, Field.Store.YES, Field.Index.ANALYZED);
                Field effect      = new Field("effect", card.effect, Field.Store.YES, Field.Index.ANALYZED);
                Field infrequence = new Field("infrequence", card.infrequence, Field.Store.YES, Field.Index.ANALYZED);
                Field package     = new Field("package", card.package, Field.Store.YES, Field.Index.ANALYZED);
                Field limit       = new Field("limit", card.limit.ToString(), Field.Store.YES, Field.Index.ANALYZED);
                Field cheatcode   = new Field("cheatcode", card.cheatcode, Field.Store.YES, Field.Index.ANALYZED);
                Field aliasList   = new Field("aliasList", card.aliasList, Field.Store.YES, Field.Index.ANALYZED);
                Field adjust      = new Field("adjust", card.adjust, Field.Store.YES, Field.Index.NO);
                Field associate   = new Field("associate", card.associate, Field.Store.YES, Field.Index.NO);
                Field cardCamp    = new Field("cardCamp", card.cardCamp.ToString(), Field.Store.YES, Field.Index.ANALYZED);

                Field level     = null;
                Field pendulumL = null;
                Field pendulumR = null;
                Field element   = null;
                Field tribe     = null;
                Field atk       = null;
                Field atkValue  = null;
                Field def       = null;
                Field defValue  = null;
                if (ict < 20)
                {
                    //怪兽卡
                    level     = new Field("level", string.Format("{0:D2}", card.level), Field.Store.YES, Field.Index.NOT_ANALYZED);
                    pendulumL = new Field("pendulumL", string.Format("{0:D2}", card.pendulumL), Field.Store.YES, Field.Index.NOT_ANALYZED);
                    pendulumR = new Field("pendulumR", string.Format("{0:D2}", card.pendulumR), Field.Store.YES, Field.Index.NOT_ANALYZED);
                    element   = new Field("element", card.element, Field.Store.YES, Field.Index.NOT_ANALYZED);
                    tribe     = new Field("tribe", card.tribe, Field.Store.YES, Field.Index.NOT_ANALYZED);
                    atk       = new Field("atk", card.atk, Field.Store.YES, Field.Index.NOT_ANALYZED);
                    atkValue  = new Field("atkValue", string.Format("{0:D4}", card.atkValue), Field.Store.YES, Field.Index.NOT_ANALYZED);
                    //atkValue = new NumericField("atkValue", Field.Store.YES, true).SetIntValue(card.atkValue);
                    def      = new Field("def", card.def, Field.Store.YES, Field.Index.NOT_ANALYZED);
                    defValue = new Field("defValue", string.Format("{0:D4}", card.defValue), Field.Store.YES, Field.Index.NOT_ANALYZED);
                }
                else
                {
                    //魔陷卡
                    level     = new Field("level", "-01", Field.Store.YES, Field.Index.NOT_ANALYZED);
                    pendulumL = new Field("pendulumL", "-01", Field.Store.YES, Field.Index.NOT_ANALYZED);
                    pendulumR = new Field("pendulumR", "-01", Field.Store.YES, Field.Index.NOT_ANALYZED);
                    element   = new Field("element", "", Field.Store.YES, Field.Index.NOT_ANALYZED);
                    tribe     = new Field("tribe", "", Field.Store.YES, Field.Index.NOT_ANALYZED);
                    atk       = new Field("atk", "", Field.Store.YES, Field.Index.NOT_ANALYZED);
                    atkValue  = new Field("atkValue", "-0002", Field.Store.YES, Field.Index.NOT_ANALYZED);
                    def       = new Field("def", "", Field.Store.YES, Field.Index.NOT_ANALYZED);
                    defValue  = new Field("defValue", "-0002", Field.Store.YES, Field.Index.NOT_ANALYZED);
                }

                doc.Add(ID);
                doc.Add(name);
                doc.Add(name2);
                doc.Add(japName);
                doc.Add(japName2);
                doc.Add(enName);
                doc.Add(oldName);
                doc.Add(shortName);
                doc.Add(oldName2);
                doc.Add(shortName2);

                doc.Add(pyname);
                doc.Add(pyoldName);
                doc.Add(pyshortName);

                doc.Add(cardType);
                doc.Add(cardType2);
                doc.Add(level);
                doc.Add(pendulumL);
                doc.Add(pendulumR);
                doc.Add(element);
                doc.Add(tribe);
                doc.Add(effectType);
                doc.Add(atk);
                doc.Add(atkValue);
                doc.Add(def);
                doc.Add(defValue);
                doc.Add(effect);
                doc.Add(infrequence);
                doc.Add(package);
                doc.Add(limit);
                doc.Add(cheatcode);
                doc.Add(aliasList);
                doc.Add(adjust);
                doc.Add(associate);
                doc.Add(cardCamp);

                if (card.iCardType == 1)
                {
                    doc.SetBoost(1);
                }
                else
                {
                    doc.SetBoost(2);
                }

                writer.AddDocument(doc);

                if (processchanged != null)
                {
                    processchanged.Invoke(cards.Length, i + 1);
                }
            }
            writer.Optimize();
            writer.Close();

            //记录当前索引文件夹的文件列表
            if (dirname[dirname.Length - 1] != '\\')
            {
                dirname += "\\";
            }
            string files = "";

            foreach (string s in Directory.GetFiles(dirname))
            {
                string ss = s.Substring(s.LastIndexOf('\\') + 1);
                if (!string.Equals(ss, "list.txt", StringComparison.OrdinalIgnoreCase))
                {
                    files += ss + "\r\n";
                }
            }
            File.WriteAllText(dirname + "list.txt", files, Encoding.UTF8);
        }