/// <summary> /// 创建索引 /// </summary> private void CreateIndexByData(string IndexSavePath) { string indexPath = Context.Server.MapPath(IndexSavePath);//索引文档保存位置 //删除原来的索引 if (System.IO.Directory.Exists(indexPath)) { System.IO.Directory.Delete(indexPath, true); } FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory()); //IndexReader:对索引库进行读取的类 bool isExist = IndexReader.IndexExists(directory); //是否存在索引库文件夹以及索引库特征文件 if (isExist) { //如果索引目录被锁定(比如索引过程中程序异常退出或另一进程在操作索引库),则解锁 //Q:存在问题 如果一个用户正在对索引库写操作 此时是上锁的 而另一个用户过来操作时 将锁解开了 于是产生冲突 --解决方法后续 if (IndexWriter.IsLocked(directory)) { IndexWriter.Unlock(directory); } } //创建向索引库写操作对象 IndexWriter(索引目录,指定使用盘古分词进行切词,最大写入长度限制) //补充:使用IndexWriter打开directory时会自动对索引库文件上锁 IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isExist, IndexWriter.MaxFieldLength.UNLIMITED); TagBLL tagBll = new TagBLL(); var tagModels = tagBll.QueryList(0, -1, null, "TId"); //--------------------------------遍历数据源 将数据转换成为文档对象 存入索引库 foreach (var tag in tagModels) { Document document = new Document(); //new一篇文档对象 --一条记录对应索引库中的一个文档 //向文档中添加字段 Add(字段,值,是否保存字段原始值,是否针对该列创建索引) document.Add(new Field("id", tag.TId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));//--所有字段的值都将以字符串类型保存 因为索引库只存储字符串类型数据 //Field.Store:表示是否保存字段原值。指定Field.Store.YES的字段在检索时才能用document.Get取出原值 //Field.Index.NOT_ANALYZED:指定不按照分词后的结果保存--是否按分词后结果保存取决于是否对该列内容进行模糊查询 document.Add(new Field("tag", tag.TagName, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); //Field.Index.ANALYZED:指定文章内容按照分词后结果保存 否则无法实现后续的模糊查询 //WITH_POSITIONS_OFFSETS:指示不仅保存分割后的词 还保存词之间的距离 //document.Add(new Field("content", book.ContentDescription, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); writer.AddDocument(document); //文档写入索引库 } writer.Close();//会自动解锁 directory.Close(); //不要忘了Close,否则索引结果搜不到 }
public static void Main() { StreamReader sr = new StreamReader("1.txt"); TagBLL bll = new TagBLL(); while (!sr.EndOfStream) { string str = sr.ReadLine(); bll.Insert(new Picture.Model.TagModel() { TagName=str }); } sr.Close(); sr.Dispose(); Console.ReadKey(); }