lucene.net和(pangu)盘古分词 搜索引擎的简单实现
这篇文章是介绍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)盘古分词 搜索引擎的简单实现相关推荐
- Lucene.Net3.0.3+盘古分词器学习使用
一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...
- Lucene.Net+盘古分词-开发自己的搜索引擎
//封装类 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Luc ...
- Lucene.Net+盘古分词器(详细介绍)(转)
Lucene.Net+盘古分词器(详细介绍)(转) Lucene.Net+盘古分词器(详细介绍) 本章阅读概要 1.Lucenne.Net简介 2.介绍盘古分词器 3.Lucene.Net实例分析 4 ...
- 站内搜索——Lucene +盘古分词
为了方便的学习站内搜索,下面我来演示一个MVC项目. 1.首先在项目中[添加引入]三个程序集和[Dict]文件夹,并新建一个[分词内容存放目录] Lucene.Net.dll.PanGu.dll.Pa ...
- 让盘古分词支持最新的Lucene.Net 3.0.3
原文:让盘古分词支持最新的Lucene.Net 3.0.3 好多年没升级过的Lucene.Net最近居然升级了,到了3.0.3后接口发生了很大变化,原来好多分词库都不能用了,所以上次我把MMSeg给修 ...
- java盘古分词_.NET使用Lucene.Net和盘古分词类库实现中文分词
.NET中文分词实现http://http:// 使用 Lucene.Net.dll http://www.apache.org/dist/incubator/lucene.net/binaries/ ...
- Lucene.net和盘古分词使用小结
盘古分词是开源项目,核心技术基于Lucene.net.虽然有点旧(2010年),但是还是可以用的.案例.应用程序.以及源码可以详见以下链接. http://pangusegment.codeplex. ...
- 全文检索 使用最新lucene3.0.3+最新盘古分词 pangu2.4 .net 实例
开发环境 vs2015 winform 程序 1 首先需要下载对应的DLL 文章后面统一提供程序下载地址 里面都有 2 配置pangu的参数 也可以不配置 采用默认的即可 3 创建索引,将索引存放到本 ...
- 盘古分词 - 多元分词算法
中文分词按照分词粒度来分,分成 一元分词,二元分词,多元分词和精确分词等类型.一元分词就是最简单的分词,将所有的中文字符按照单字形式输出.二元分词按双字形式输出.多元分词则是将一句话中可能的单词组合按 ...
- 盘古分词 - 多元分词
作者:eaglet 盘古分词开发了多元分词算法,其与lucene.net 配合构建全文搜索,经测试准确度接近google和baidu的水平.现将一些实现方法和测试结果公布出来,供关心分词和搜索技术的朋 ...
最新文章
- javascript选择器_如何通过选择正确JavaScript选择器来避免沮丧
- windows自动修复失败,无法启动
- RouterOS SOCKS代理服务器(官方文档翻译)
- geotif 添加坐标_python – 如何获取geotif中单元格的坐标?
- (王道408考研数据结构)第八章排序-第四节2:快速排序
- 【网站】网站不能在QQ,微信中访问,申诉办法
- 返回相同宽度数字型字符串
- java代码审计文件包含_代码审计--一道简单的文件包含题目的多种利用方式
- Gald to meet you
- android平板能玩吃鸡吗,刺激战场用什么平板好 平板吃鸡配置推荐
- Word2013制作中国的传统福字在屋门上贴的福字(福倒了)
- Windows自带远程桌面,非常好用的全新体验。
- c语言中出现nan错误,c语言中浮点运算的inf和nan错误
- 高新技术企业认定条件
- 智能物联网网关有哪些必备功能
- 计算机网络大学生职业生涯范文,计算机网络专业大学生职业生涯规划书
- 搜狗输入法android皮肤,搜狗输入法皮肤盒子app
- iphone字体大小使用的像素
- IronMCC 多媒体展厅中控系统
- rfid资产管理系统的优势