很早以前写的lucenet.net搜索

//创建索引库

string indexPath = Server.MapPath("~/temp");//索引库(索引→Index)
            //开始创建索引;
            //开始创建索引,目录:" + indexPath;
            FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory()); //FSDirectory存储文件的索引
 
            bool isUpdate = IndexReader.IndexExists(directory);//判断一个索引库是否存在
            if (isUpdate)
            {
                //索引库已经存在;
                if (IndexWriter.IsLocked(directory))
                {
                    //索引库被锁定,进行解锁;
                    IndexWriter.Unlock(directory);
                }
            }
 
            IndexWriter writer = new IndexWriter(directory,
                new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
            //directiory 根据一个字符串描述的路径,为建立的索引文件指定存放目录
            //PanGuAnalyzer 一个分析器
            //第三个参数 如果为true表示重写索引文件,false表示追加索引文件信息
            IList<MaiDong_Deal> list = GetAllMaiDong_DealApi();
 
            for (int i = 0; i < list.Count; i++)
            {
                //如果搜不出来,看看是不是编码的问题
                Document document = new Document(); //创建索引文档,例如一张白纸
                document.Add(new Field("number", i.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
                document.Add(new Field("title", list[i].DealName, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
                document.Add(new Field("body", list[i].Intro, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
                writer.DeleteDocuments(new Term("number", i.ToString()));  //删除索引库
                writer.AddDocument(document);  //讲白纸放进索引文件
            }
           writer.Optimize();  //对索引进行优化
            writer.Close();
            directory.Close();
            //索引完毕;
            Response.Write("创建索引完毕");

  

/// <summary>
       /// 1,制定索引库位置,
       /// 2,利用indexreader可以操作索引库
       /// 3,indexsearcher得到Indexreader进行搜索对索引库
       /// 4,对客户关键词进行分词(Query代表用户的查询语句)
       /// 5,使用IndexSearcher进行搜索,把搜索结果放进TopScoreDocCollector集合中
       /// 6,从TopScoreDocCollector中获取docId集合放在ScoreDoc中
       /// 7,然后Indexsearcher根据docId 获得数据文档Document
       void Result_PreRender(object sender, EventArgs e)
       {
           string kw = Request["wd"];
           string indexPath = Server.MapPath("~/temp");
           FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
           IndexReader reader = IndexReader.Open(directory, true);
           IndexSearcher searcher = new IndexSearcher(reader);//创建索引搜索器
           PhraseQuery query = new PhraseQuery();
           string[] words = CommonHelper.SplitWords(kw);
           foreach (string word in words)
           {
 
               query.Add(new Term("title", word));
 
           }
            
           query.SetSlop(100); //相隔可以查询中间相隔几个个字把(我们的这分成我们,的两个词) 如 1,我们 2,的 不加他查询是(我们的),加上坡度就可以是(我们与的),(我们和的)就是把词的单个都查出来
           //创建结果文档收集器
           TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);//搜索1000条数据,true代表是否排序(按照积分)(相当于多个Hits的集合)
           searcher.Search(query, null, collector); //将所搜寻出来的结果以特定的形式放在collector中
           StringBuilder sb = new StringBuilder();
           this.anpUsers.RecordCount = collector.GetTotalHits();
            
           if (string.IsNullOrEmpty(Request.QueryString["page"]))
           {
               sb.Append("/Result.aspx?page={0}");
               this.anpUsers.CurrentPageIndex = 1;
           }
           else if (!string.IsNullOrEmpty(Request.QueryString["page"]))
           {
               sb.Append("/Result.aspx?page={0}");
              this.anpUsers.CurrentPageIndex = Convert.ToInt32(Request.QueryString["page"]);
           }
           if (!string.IsNullOrEmpty(kw))
           {
               sb.Append("&wd=" + kw);
           }
           this.anpUsers.UrlRewritePattern = sb.ToString();
           int startPos = Math.Max((this.anpUsers.CurrentPageIndex - 1) * this.anpUsers.PageSize, 0);
           ScoreDoc[] docs = collector.TopDocs(startPos, this.anpUsers.PageSize).scoreDocs;//scoreDocs 配文档的集合包含了DocId和Score 一般通过DocId取文档
 
           List<SearchResult> list = new List<SearchResult>();
           for (int i = 0; i < docs.Length; i++)
           {
               int docId = docs[i].doc;  // 根据命中的文档的内部编号获取该文档
               Document doc = searcher.Doc(docId);
               //string number = doc.Get("number");
               string body = doc.Get("body");
               string title = doc.Get("title");
               SearchResult result = new SearchResult();
               
           result.Body = body;
 
            result.Title = CommonHelper.HighLight(kw, title);
               list.Add(result);
           }
 
           Repeater1.DataSource = list;
           Repeater1.DataBind();
 
       }

  

posted @   rains  阅读(745)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示