这篇文章是介绍lucene.net和盘古分词的简单的实现调用  。建立索引,搜索,盘古分词的基类如下:

using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using Lucene.Net.Index; using Lucene.Net.Documents; using Lucene.Net.QueryParsers; using Lucene.Net.Analysis; using Lucene.Net.Search; using Lucene.Net.Analysis.Standard; using PanGu; using Lucene.Net.Analysis.PanGu; using StringBulider; using System.Text; using System.Collections; using System.Collections.Generic; /// <summary> ///辅导资料的搜索逻辑 的摘要说明 /// </summary> public class DataSearch { public DataSearch() { // //TODO: 在此处添加构造函数逻辑 // } A_DB_Conn db = null; string index = System.Web.HttpContext.Current.Server.MapPath("~/Gongxin/DataIndex");//索引路径 string wordPath = System.Web.HttpContext.Current.Server.MapPath("~/Dictionaries");//字典路径 //用于存储检索出数据总数 private int _count; public int Count { get { return _count; } set { _count = value; } } //搜索关键字 private string _keyword; public string KeyWord { get { return _keyword;} set{_keyword = value;} } //搜索时间 private double _time; public double Time { get { return _time; } set { _time = value; } } /// <summary> /// 得到数据结果集 /// </summary> /// <returns></returns> public DataTable GetDS() { db = new A_DB_Conn(); string sql = "select N_id,N_title,N_datetime,N_Content from N_Newinfo where N_ifkping=1 and N_id=12 order by N_datetime desc"; DataTable dataTable = null; try { dataTable = db.GetDataSet(sql).Tables[0]; } catch { dataTable = null; } finally { db.close(); db.Dispose(); } return dataTable; } /// <summary> /// 添加索引域 /// </summary> /// <param name="writer"></param> /// <param name="dataTable"></param> public void AddDocument(IndexWriter writer, DataTable dataTable) { for (int i = 0; i < dataTable.Rows.Count; i++) { Document doc = new Document(); doc.Add(new Field("ID", dataTable.Rows[i]["N_id"].ToString(),Field.Store.YES,Field.Index.TOKENIZED)); doc.Add(new Field("N_title",StringCheck.SqlQueryDecode(dataTable.Rows[i]["N_title"].ToString()),Field.Store.YES,Field.Index.TOKENIZED)); doc.Add(new Field("N_datetime", dataTable.Rows[i]["N_datetime"].ToString(),Field.Store.YES,Field.Index.TOKENIZED)); if (StringCheck.SqlQueryDecode(dataTable.Rows[i]["N_Content"].ToString()).Length > 100) { doc.Add(new Field("N_Content", StringCheck.SqlQueryDecode(dataTable.Rows[i]["N_Content"].ToString()).Replace("<p>","").Replace("</p>","").Substring(0, 200), Field.Store.YES, Field.Index.TOKENIZED)); } else { doc.Add(new Field("N_Content", StringCheck.SqlQueryDecode(dataTable.Rows[i]["N_Content"].ToString()).Replace("<p>", "").Replace("</p>", ""), Field.Store.YES, Field.Index.TOKENIZED)); } writer.AddDocument(doc); } } /// <summary> /// 建立索引 /// </summary> public void Index() { PanGu.Segment.Init(); PanGuAnalyzer analyzer = new PanGuAnalyzer(); IndexWriter writer = new IndexWriter(index, analyzer, true); DataTable dataTable = GetDS(); AddDocument(writer, dataTable); writer.Optimize(); writer.Close(); } /// <summary> /// 对药搜索的词进行分词 /// </summary> /// <param name="keyWords">要收索的词</param> /// <param name="ktTokenizer">分词对象</param> /// <returns>分词后的结果</returns> public string GetKeyWordSplitBySpace(string keyWords, PanGuTokenizer ktTokenizer) { StringBuilder builder = new StringBuilder(); ICollection<WordInfo> words = ktTokenizer.SegmentToWordInfos(keyWords); foreach(WordInfo word in words) { if (word == null) { continue; } KeyWord = KeyWord + word+","; builder.AppendFormat("{0}^{1}",word.Word,(int)Math.Pow(3,word.Rank)); } KeyWord = KeyWord.Substring(0, KeyWord.Length - 1); return builder.ToString().Trim(); } /// <summary> /// 检索信息 /// </summary> /// <param name="keyWord">检索关键字</param> /// <param name="pageNumber">当前第几条</param> /// <param name="pageSize">每页显示的条数</param> /// <returns></returns> public string Search(string keyWord, int pageNumber, int pageSize) { string word = GetKeyWordSplitBySpace(keyWord, new PanGuTokenizer()); IndexSearcher search = new IndexSearcher(index); StringBuilder builder = new StringBuilder(); PanGuAnalyzer analyzer = new PanGuAnalyzer(true); //多字段搜索字段 MultiFieldQueryParser parser = new MultiFieldQueryParser(new string[] { "N_title" },analyzer); //分词 Query query = parser.Parse(word); Hits hits = search.Search(query); Count = hits.Length(); int num = 0;//记录每页最后一条 if (Count < pageNumber + pageSize) { num = Count; } else { num = pageSize + pageNumber; } DateTime begin = DateTime.Now; for (int i = pageNumber; i < num; i++) { Document doc = hits.Doc(i); //创建HTMLFormatter,参数为高亮搜索词的HTML代码 PanGu.HighLight.SimpleHTMLFormatter simpleHTMLFormatter = new PanGu.HighLight.SimpleHTMLFormatter("<font color='red'>", "</font>"); //创建高亮,输入HTML代码和 盘古对象Semgent PanGu.HighLight.Highlighter highter = new PanGu.HighLight.Highlighter(simpleHTMLFormatter, new Segment()); //设置每个摘要字段的字符数 highter.FragmentSize = 200; string title = highter.GetBestFragment(keyWord, doc.Get("N_title")); builder.Append("<div class='sea_h_list'>"); if (!string.IsNullOrEmpty(title)) { builder.Append("<h2><a href="D_NewBody.aspx?gxjy=" + UrlEncrpt.Encrypt(doc.Get("ID")) + "" mce_href="D_NewBody.aspx?gxjy=" + UrlEncrpt.Encrypt(doc.Get("ID")) + "" target='_blank'>" + highter.GetBestFragment(keyWord, doc.Get("N_title")) + "</a></h2>"); } else { builder.Append("<h2>" + doc.Get("N_title") + "</h2>"); } builder.Append(doc.Get("N_Content")); DateTime time = Convert.ToDateTime(doc.Get("N_datetime")); builder.Append("<div>"+time.ToString("yyyy-MM-dd")+"</div>"); builder.Append("</div>"); } DateTime end = DateTime.Now; double ts = (end - begin).TotalMilliseconds; Time =ts / 1000.000; search.Close();//关闭检索器 return builder.ToString(); } }

前台可以用一个button调用一个button事件来生成索引

前台生成索引事件如下。

protected void Button1_Click(object sender, EventArgs e) { search = new NewsSearch(); search.Index(); Response.Write("<Script>alert('索引生成成功!')</Script>"); }

索引生成成功后,就可以进行搜索了,本人实现搜索的功能时调用了AspNetPager分页控件,具体的搜索的方法如下:

public void GetInfoList(string keyWord) { try { search = new NewsSearch(); Stopwatch sw = new Stopwatch(); sw.Start(); InfoList = search.Search(keyWord, (this.AspNetPager1.CurrentPageIndex - 1) * this.AspNetPager1.PageSize, this.AspNetPager1.PageSize); sw.Stop(); time = (sw.ElapsedMilliseconds / 1000.000).ToString();//显示所用搜索时间 if (InfoList.Trim().Length == 0) { InfoList = "<div class='rig01_center red'>暂无搜索信息。</div>"; } this.AspNetPager1.RecordCount = search.Count; count = search.Count.ToString();//搜索的条数 strkeyWord = search.KeyWord;//显示搜索关键字 } catch { Response.Redirect("404.html"); } }

其中 Stopwatch使用了计算搜索所用的时间,将它复制到time 全局变量中,count 全局变量时用来存储搜索的条数。

搜索出来数据后,前台页面用<%=count%><%=time%> <%=InfoList%>

调用即可。

前台显示效果:

本文只是简单的实现了lucene.net 和盘古分词,仅供大家学习,有不足的地方还请见谅,有疑问随时联系,谢谢!

lucene.net和(pangu)盘古分词 搜索引擎的简单实现相关推荐

  1. Lucene.Net3.0.3+盘古分词器学习使用

    一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...

  2. Lucene.Net+盘古分词-开发自己的搜索引擎

    //封装类 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Luc ...

  3. Lucene.Net+盘古分词器(详细介绍)(转)

    Lucene.Net+盘古分词器(详细介绍)(转) Lucene.Net+盘古分词器(详细介绍) 本章阅读概要 1.Lucenne.Net简介 2.介绍盘古分词器 3.Lucene.Net实例分析 4 ...

  4. 站内搜索——Lucene +盘古分词

    为了方便的学习站内搜索,下面我来演示一个MVC项目. 1.首先在项目中[添加引入]三个程序集和[Dict]文件夹,并新建一个[分词内容存放目录] Lucene.Net.dll.PanGu.dll.Pa ...

  5. 让盘古分词支持最新的Lucene.Net 3.0.3

    原文:让盘古分词支持最新的Lucene.Net 3.0.3 好多年没升级过的Lucene.Net最近居然升级了,到了3.0.3后接口发生了很大变化,原来好多分词库都不能用了,所以上次我把MMSeg给修 ...

  6. java盘古分词_.NET使用Lucene.Net和盘古分词类库实现中文分词

    .NET中文分词实现http://http:// 使用 Lucene.Net.dll http://www.apache.org/dist/incubator/lucene.net/binaries/ ...

  7. Lucene.net和盘古分词使用小结

    盘古分词是开源项目,核心技术基于Lucene.net.虽然有点旧(2010年),但是还是可以用的.案例.应用程序.以及源码可以详见以下链接. http://pangusegment.codeplex. ...

  8. 全文检索 使用最新lucene3.0.3+最新盘古分词 pangu2.4 .net 实例

    开发环境 vs2015 winform 程序 1 首先需要下载对应的DLL 文章后面统一提供程序下载地址 里面都有 2 配置pangu的参数 也可以不配置 采用默认的即可 3 创建索引,将索引存放到本 ...

  9. 盘古分词 - 多元分词算法

    中文分词按照分词粒度来分,分成 一元分词,二元分词,多元分词和精确分词等类型.一元分词就是最简单的分词,将所有的中文字符按照单字形式输出.二元分词按双字形式输出.多元分词则是将一句话中可能的单词组合按 ...

  10. 盘古分词 - 多元分词

    作者:eaglet 盘古分词开发了多元分词算法,其与lucene.net 配合构建全文搜索,经测试准确度接近google和baidu的水平.现将一些实现方法和测试结果公布出来,供关心分词和搜索技术的朋 ...

最新文章

  1. javascript选择器_如何通过选择正确JavaScript选择器来避免沮丧
  2. windows自动修复失败,无法启动
  3. RouterOS SOCKS代理服务器(官方文档翻译)
  4. geotif 添加坐标_python – 如何获取geotif中单元格的坐标?
  5. (王道408考研数据结构)第八章排序-第四节2:快速排序
  6. 【网站】网站不能在QQ,微信中访问,申诉办法
  7. 返回相同宽度数字型字符串
  8. java代码审计文件包含_代码审计--一道简单的文件包含题目的多种利用方式
  9. Gald to meet you
  10. android平板能玩吃鸡吗,刺激战场用什么平板好 平板吃鸡配置推荐
  11. Word2013制作中国的传统福字在屋门上贴的福字(福倒了)
  12. Windows自带远程桌面,非常好用的全新体验。
  13. c语言中出现nan错误,c语言中浮点运算的inf和nan错误
  14. 高新技术企业认定条件
  15. 智能物联网网关有哪些必备功能
  16. 计算机网络大学生职业生涯范文,计算机网络专业大学生职业生涯规划书
  17. 搜狗输入法android皮肤,搜狗输入法皮肤盒子app
  18. iphone字体大小使用的像素
  19. IronMCC 多媒体展厅中控系统
  20. rfid资产管理系统的优势

热门文章

  1. 速学 | 如何帮女朋友用Java合并两个PDF
  2. 模拟位置 定位 钉钉打卡 运动轨迹 MD
  3. python 绘制太阳花
  4. 我的2019归零,2020走你
  5. 腾讯 AI Lab 2020 年度回顾
  6. 前端学习笔记之三PS
  7. 非常全面详细的Sklearn介绍
  8. 线下综合体-中岛店的一些思考
  9. 电脑计算机无法加载,电脑网页视频一直显示无法加载插件
  10. 闰月c语言函数,中国农历闰月怎么闰 一般都是哪几个月?