您的位置:首页 > 其它

Lucene.net 搜索引擎技术 及分页

2016-09-01 17:46 183 查看
http://www.liveq.net/?p=142  详细使用技术http://space.cnblogs.com/group/topic/4683/   相关技术http://www.liveq.net/?p=169  创建索引1.首先得把Lucene.Net.dll这个添加引用;2.Highlighter.Net.dll 可选,用于查询字体高亮度显示;            /// 建立索引        public void CreateIndex()        {            string indexPath = Server.MapPath("index");//定义索引文件存放路径            IndexWriter writer = new IndexWriter(indexPath, new StandardAnalyzer(), true);            //第一个参数是路径            //第二个是索引分词器,不同的分词器代表不同的存放方式,目前分词仍没有达到100%标准            //第三个参数是是否覆盖已存在的索引(不覆盖即以追加的形式写入文件)            DataTable dt = dal.GetList("");     // 从数据库查询集合列表,然后循环添加到Document文档中去            for (int i = 0; i < dt.Rows.Count; i++)            {                Document doc = new Document();//初始化索引文档,就像一张白纸                doc.Add(new Field("CompanyName", dt.Rows[i]["CompanyName"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));                doc.Add(new Field("Comid", dt.Rows[i]["Comid"].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));                //向白纸写入键值对,索引是以哈希算法(依我理解)对文件的键值对进行搜索                //Field.Store.YES对索引字段进行存储,也就是返回的结果有该字段,相反Field.Store.NO就是不存储                //Field.Index.TOKENIZED,对该字段进行分词处理,类似TSQL的like %% ,UN_TOKENIZED就是不分词,全词匹配                writer.AddDocument(doc);//将设计好的白纸文件放进索引文件里            }            writer.Optimize();//优化索引            writer.Close();        }// 绑定显示值private void bidn()        {
   // 分页    int pageSize = 12 ;   // 每页显示多少条数据           int currentPage =  1; // 动态获取每点击下页的索引currentpageIndex            string indexPath = Server.MapPath("index");//定义索引文件存放路径            string keyword = this.txtserach.Text;   // 搜索传入的条件            if (keyword != "")            {                IndexSearcher searcher = new IndexSearcher(indexPath);                Analyzer analyzer = new StandardAnalyzer();                QueryParser query = new QueryParser("CompanyName", analyzer);
                Query query1 = query.Parse(keyword);                BooleanQuery boolQuery = new BooleanQuery();
                // 高亮度显示                Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter("<font color=\"red\">", "</font>"), new                                        QueryScorer(query1));//使用高亮关键字显示替代关键字                highlighter.SetTextFragmenter(new SimpleFragmenter(100));
                DateTime time = DateTime.Now;                Hits hits = searcher.Search(query1);                DateTime end = DateTime.Now;                long ltime = end.Millisecond - time.Millisecond;                this.txtcontents.Text = "<font size=2 >关于 <b><font color=blue>" + keyword + "</font><b/> 共搜索到<b><font color=red>" + hits.Length() + "</font></b>个相关结果.搜索耗时:<font color=red>" + ltime + "</font>毫秒.</font></br>";
                if (hits != null)                { int start = pageSize * (currentPage - 1); int end = currentPage * pageSize; end = hits.Length()< end ? hits.Length(): end;
                    DataTable mytab = new DataTable();                    mytab.Columns.Add("Comid");                    mytab.Columns.Add("CompanyName");                    mytab.Clear();             //  添加需要显示的列表字段                    for (int i = start; i < end ; i++)     // 不分页情况下for(int i=0;i<hits.length();i++)                    {                        Document doc = hits.Doc(i);                       DataRow   dr = mytab.NewRow();                        dr[0] = doc.Get("Comid").ToString();                        dr[1] = doc.Get("CompanyName").ToString();                        mytab.Rows.Add(dr);                    }
                    PagedDataSource pds = new PagedDataSource();                    pds.DataSource = mytab.DefaultView;                    this.AspNetPager1.RecordCount = pds.Count;                    pds.AllowPaging = true;                    pds.CurrentPageIndex = this.AspNetPager1.CurrentPageIndex - 1;                    pds.PageSize = 20;                    this.rtshort.DataSource = pds;                    this.rtshort.DataBind();                }            }
----- 第二种方法就是返回所有结果列表PagedDataSource 分页   PagedDataSource pds = new PagedDataSource();                pds.DataSource = dtSearch.DefaultView;               this.anpcurrent.RecordCount = pds.Count;                pds.AllowPaging = true;                pds.PageSize = this.anpcurrent.PageSize;                pds.CurrentPageIndex = this.anpcurrent.CurrentPageIndex - 1;                rtproduct.DataSource = pds;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: