/// <summary> /// 保存 /// </summary> /// <param name="doc"></param> /// <returns></returns> public bool SubmitForm(KnowledgeInfoEntity entity, string keyValue) { if (!string.IsNullOrEmpty(keyValue)) { //修改 entity.knowledgeGUID = keyValue; entity.UpdateDate = DateTime.Now; _knowledgeRepository.Update(entity); #region 创建索引 //创建索引 var updateEntity = _knowledgeRepository.FindEntity(keyValue); IndexData indexData = new IndexData(); indexData.JobType = JobType.Up; indexData.Data = updateEntity; var indexManage = IndexManager.GetInstance(); indexManage.AddJobs(indexData); #endregion return(true); } else { entity.CreateById = OperatorProvider.Provider.Current().UserId; entity.CreateBy = OperatorProvider.Provider.Current().UserName; entity.CreateDate = DateTime.Now; entity.UpdateDate = DateTime.Now; entity.knowledgeGUID = Guid.NewGuid().ToString(); entity.ViewCount = 1; #region 创建索引 //创建索引 IndexData indexData = new IndexData(); indexData.JobType = JobType.New; indexData.Data = entity; var indexManage = IndexManager.GetInstance(); indexManage.AddJobs(indexData); #endregion return(_knowledgeRepository.Insert(entity)); } }
/// <summary> /// 处理实际数据 /// </summary> /// <param name="writer"></param> private void ProcessJobs() { Regex r = new Regex("<img.[^>]+[>]+", RegexOptions.ExplicitCapture); KnowledgeInfoEntity dataManager = new KnowledgeInfoEntity(); while (jobs.Count != 0) { IndexData job = jobs.Dequeue(); string IndexDic = __SearchAppIndexPath; //创建索引目录 if (!System.IO.Directory.Exists(IndexDic)) { System.IO.Directory.CreateDirectory(IndexDic); } FSDirectory directory = FSDirectory.Open(new DirectoryInfo(IndexDic), new NativeFSLockFactory()); bool isUpdate = IndexReader.IndexExists(directory); //logger.Debug("索引库存在状态" + isUpdate); if (isUpdate) { //如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁 if (IndexWriter.IsLocked(directory)) { //logger.Debug("开始解锁索引库"); IndexWriter.Unlock(directory); //logger.Debug("解锁索引库完成"); } } IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED); writer.DeleteDocuments(new Term("knowledgeGUID", job.Data.knowledgeGUID.ToString())); //如果是“添加任务”再添加, if (job.JobType == JobType.Up || job.JobType == JobType.New) { KnowledgeInfoEntity data = job.Data; /*去除为NULL数据*/ if (string.IsNullOrEmpty(data.Title)) { data.Title = string.Empty; } if (string.IsNullOrEmpty(data.ContentNoHtml)) { data.ContentNoHtml = string.Empty; } if (string.IsNullOrEmpty(data.Summary)) { data.Summary = string.Empty; } if (string.IsNullOrEmpty(data.CreateBy)) { data.CreateBy = string.Empty; } Document document = new Document(); document.Add(new Field("knowledgeGUID", data.knowledgeGUID.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); document.Add(new Field("Title", data.Title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); document.Add(new Field("ContentNoHtml", r.Replace(data.ContentNoHtml, ""), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); document.Add(new Field("Summary", data.Summary, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); document.Add(new Field("CreateBy", data.CreateBy, Field.Store.YES, Field.Index.NOT_ANALYZED)); document.Add(new Field("UpdateDate", data.UpdateDate.Value.ToString("yyyy-MM-dd"), Field.Store.YES, Field.Index.NOT_ANALYZED)); document.Add(new Field("ViewCount", data.ViewCount.ToString(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); document.Add(new Field("DataType", data.DataType, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); writer.AddDocument(document); //logger.Debug("索引" + job.Data.DataGUID.ToString() + "完毕"); } writer.Close(); directory.Close();//不要忘了Close,否则索引结果搜不到 } }
/// <summary> /// 查询数据 /// </summary> /// <param name="startRowIndex"></param> /// <param name="pageSize"></param> /// <param name="totalCount"></param> /// <returns></returns> public List <KnowledgeInfoEntity> ShowDatas(SearchParam SearchParam, string[] JS_Fields) { List <KnowledgeInfoEntity> listData = new List <KnowledgeInfoEntity>(); FSDirectory directory = FSDirectory.Open(new DirectoryInfo(__SearchAppIndexPath), new NoLockFactory()); IndexReader reader = IndexReader.Open(directory, true); //IndexSearcher是进行搜索的类 IndexSearcher searcher = new IndexSearcher(reader); BooleanQuery bQuery = new BooleanQuery(); //被""包裹,不进行分词处理 if (SearchParam.KeyValue.Length > 2 && SearchParam.KeyValue.IndexOf("\"") == 0 && SearchParam.KeyValue.LastIndexOf("\"") == SearchParam.KeyValue.Length - 1) { SearchParam.KeyValue = SearchParam.KeyValue.Substring(1, SearchParam.KeyValue.Length - 2); } else { SearchParam.KeyValue = ReplaceChar(SearchParam.KeyValue); ////分词 SearchParam.KeyValue = GetKeyWordsSplitBySpace(SearchParam.KeyValue); } if (string.IsNullOrEmpty(SearchParam.KeyValue)) { return(listData); } QueryParser parse; Query query; foreach (string strField in JS_Fields) { //创建标题索引搜索 parse = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, strField, new PanGuAnalyzer()); query = parse.Parse(SearchParam.KeyValue); parse.SetDefaultOperator(QueryParser.Operator.AND); bQuery.Add(query, BooleanClause.Occur.SHOULD); } TopScoreDocCollector collector = TopScoreDocCollector.create(__SearchAppResultMaxLength, true); //Sort sort = new Sort(new SortField("Addtime", SortField.DOC, true)); Filter filter = null; if (!string.IsNullOrEmpty(SearchParam.DataType)) { filter = new TermRangeFilter("DataType", SearchParam.DataType, SearchParam.DataType, true, true); } searcher.Search(bQuery, filter, collector); SearchParam.TotalCount = collector.GetTotalHits();//返回总条数 //分页,下标从0开始,0是第一条记录 ScoreDoc[] docs = collector.TopDocs((SearchParam.PageIndex - 1) * SearchParam.PageSize, SearchParam.PageSize).scoreDocs; for (int i = 0; i < docs.Length; i++) { //取文档的编号,这个是主键,lucene.net分配 int docID = docs[i].doc; //检索结果中只有文档的id,如果要取Document,则需要Doc再去取 //降低内容占用 Document doc = searcher.Doc(docID); string content = doc.Get("ContentNoHtml"); if (content.Length > 200) { content = content.Substring(0, 199) + "……"; } KnowledgeInfoEntity itemData = new KnowledgeInfoEntity() { knowledgeGUID = new Guid(doc.Get("knowledgeGUID")).ToString(), Title = doc.Get("Title"), Summary = doc.Get("Summary"), ContentNoHtml = content, ContentHtml = doc.Get("ContentHtml"), CreateBy = doc.Get("CreateBy"), UpdateDate = DateTime.Parse(doc.Get("UpdateDate")), ViewCount = int.Parse(doc.Get("ViewCount")), DataType = doc.Get("DataType"), }; //高亮 itemData.Title = Preview(itemData.Title, SearchParam.KeyValue); itemData.ContentNoHtml = Preview(itemData.ContentNoHtml, SearchParam.KeyValue); itemData.Summary = Preview(itemData.Summary, SearchParam.KeyValue); listData.Add(itemData); } return(listData); }
public ActionResult SubmitForm(KnowledgeInfoEntity entity, string keyValue) { var data = _app.SubmitForm(entity, keyValue); return(Success("提交成功")); }