//临时数据代替表单提交 private void InsertToIndex() { //创建一条临时数据 Books book = new Books(); book.Author = "痞子一毛"; book.Title = "piziyimao"; book.CategoryId = 1; book.ContentDescription = "不是所有痞子都叫一毛不是所有痞子都叫一毛不是所有痞子都叫一毛不是所有痞子都叫一毛"; book.PublisherId = 1; book.ISBN = "124365"; book.WordsCount = 1000000; book.UnitPrice = 88; book.CategoryId = 1; book.Clicks = 10; book.PublishDate = DateTime.Now; BooksManager bm = new BooksManager(); //IndexManager.bookIndex.Add()数据新增 索引库更新测试 //int insertId; //if((insertId = bm.Add(book)) > 0) { // book.Id = insertId; // IndexManager.bookIndex.Add(book); //} //IndexManager.bookIndex.Mod()数据修改 索引库更新测试 book.Id = 10001;//数据库生成主键ID book.ContentDescription = "侬好哇, 记住不是所有痞子都叫一毛哟"; bm.Update(book); IndexManager.bookIndex.Mod(book); }
/// <summary> /// 创建索引 /// </summary> private void CreateIndexByData() { string indexPath = Context.Server.MapPath("~/IndexData");//索引文档保存位置 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); BooksManager bookManager = new BooksManager(); List<PZYM.Shop.Model.Books> bookList = bookManager.GetModelList(""); //--------------------------------遍历数据源 将数据转换成为文档对象 存入索引库 foreach(var book in bookList) { Document document = new Document(); //new一篇文档对象 --一条记录对应索引库中的一个文档 //向文档中添加字段 Add(字段,值,是否保存字段原始值,是否针对该列创建索引) document.Add(new Field("id", book.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));//--所有字段的值都将以字符串类型保存 因为索引库只存储字符串类型数据 //Field.Store:表示是否保存字段原值。指定Field.Store.YES的字段在检索时才能用document.Get取出原值 //Field.Index.NOT_ANALYZED:指定不按照分词后的结果保存--是否按分词后结果保存取决于是否对该列内容进行模糊查询 document.Add(new Field("title", book.Title, 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,否则索引结果搜不到 }