ASP实现网站智能分词搜索
ASP实现网站智能分词搜索(精选4篇)
ASP实现网站智能分词搜索 第1篇
ASP实现网站智能分词搜索
用ASP实现搜索引擎的功能是一件很方便的事,可是,如何实现类似3721的智能搜索呢?比如,当在搜索条件框内输入“中国人民”时,自动从中提取“中国”、“人民”等关键字并在数据库内进行搜索。看完本文后,你就可以发现,这个功能实现起来竟然是如此的简单。
第一步,我们要建立一个名为db_sample.mdb的数据库(本文以Access2000数据库为例),并在其中建立表T_Sample。表T_Sample包括如下字段:ID 自动编号
U_Name 文本
U_Info 备注
第二步,我们开始设计搜索页面Search.asp。该页面包括一个表单
(Frm_Search),表单内包括一个文本框和一个提交按钮。并将表单的method属性设为“get”,action属性设为“Search.asp“,即提交给网页自身。代码如下:
以下是代码片段:
<!--Search.asp-->
<form name=”frm_Search“ method=”get“ action=”Search.asp“>请输入关键字:
<input type=”text“ name=”key“ size=”10“>
<input type=”submit“ value=”搜索“>
</form>
下面,就进入了实现智能搜索的关键部分。
首先,建立数据库连接。在Search.asp的开始处加入如下代码:
以下是代码片段:
<%
Dim strProvider,CNN
strProvider=”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“strProvider=strProvider & Server.MapPath(”“)&
”datadb_Sample.mdb“ 假设数据库存放在主页根目录下的data目录下Set CNN = Server.CreateObject(”ADODB.connection“)
CNN.Open strProvider 打开数据库连接
%>
接下来,判断 ASP页所接收到的数据,并在数据库中进行搜索。
以下是代码片段:
<font color=”#FF0000“>未找到任何结果!!</font>
<%
Else
%>
搜索名称为“<font color=”#FF0000“><%= S_Key %></font>”的项,共找到 <font color=”#FF0000“><%= RST.RecordCount %></font> 项:<p>
<%
While Not RST.EOF 遍历整个记录集,显示搜索到的信息并设置链接%>
<!--此处可设为你所需要的链接目标-->
<font style=”font: 12pt 宋体“><a href=”info.asp?ID=<%= RST(“ID”)%>“ target=”_blank“><%= RST(”U_Name“)%></a></font><!--显示部分详细内容-->
<font style=”font: 9pt 宋体“><%= Left(RST(”U_Info“),150)%></font><p>
<%
RST.MoveNext
Wend
RST.Close
Set RST=Nothing
End If
End If
%>
在上面的代码中,有一个自定义函数 AutoKey,该函数是实现智能搜索的核心所在。代码如下:
以下是代码片段:
<%
Function AutoKey(strKey)
CONST lngSubKey=2
Dim lngLenKey, strNew1, strNew2, i, strSubKey
’检测字符串的合法性,若不合法则转到出错页。出错页你可以根据需要进行设定。
if InStr(strKey,”=“)<>0 or InStr(strKey,”`“)<>0 or InStr(strKey,”“)<>0 or InStr(strKey,” “)<>0 or InStr(strKey,” “)<>0 or
InStr(strKey,”“)<>0 or InStr(strKey,chr(34))<>0 or InStr(strKey,”“)<>0 or InStr(strKey,”,“)<>0 or InStr(strKey,”<“)<>0 or InStr(strKey,”>“)<>0 then
Response.Redirect ”error.htm“
End If
lngLenKey=Len(strKey)
Select Case lngLenKey
Case 0 若为空串,转到出错页
Response.Redirect ”error.htm“
Case 1 若长度为1,则不设任何值
strNew1=”“
strNew2=”“
’Case Else 若长度大于1,则从字符串首字符开始,循环取长度为2的子字符串作为查询条件
For i=1 To lngLenKey-(lngSubKey-1)
strSubKey=Mid(strKey,i,lngSubKey)
strNew1=strNew1 & ” or U_Name like %“ & strSubKey & ”%“
strNew2=strNew2 & ” or U_Info like %“ & strSubKey & ”%“
Next
End Select
’得到完整的SQL语句
AutoKey=”Select * from T_Sample where U_Name like %“ & strKey & ”% or U_Info like %“ & strKey & ”%" & strNew1 & strNew2
End Function
%>
要实现智能搜索,其核心就是将搜索关键字进行自动分组。在此处,我们使用了循环取长度为2的子串的方法。为什么不将子串长度定为1、3、4或其他 呢?这是因为若子串长度小于2即为1时,会失去将关键字分组的功能,而若子串长度大于2,则会丢失一些词组。大家可以将 CONST lngSubKey=2改为其他数字试一试,孰优孰劣自见分晓。
最后,别忘了将数据连接关闭,以释放资源。
以下是代码片段:
<%
CNN.Close
Set CNN=Nothing
%>
至此,这个智能搜索引擎已经完成了。你还可以将其继续完善,比如添加分页、突出显示等功能。好了,不耽误大家时间了,赶快去试一试吧。
ASP实现网站智能分词搜索 第2篇
作者根据自己做网站时需求, 开发了一个整站静态页搜索程序, 通过站内搜索引擎极大地方便了习惯于使用搜索引擎查找信息的网站访问者, 同时也可以避免有的页面由于链接层数太深或链接设置不当而很难访问到的问题。
1 分类
1.1 通过搜索网站提供的搜索
做过站长的人应该知道, 像百度之类的搜索网站提供site命令, 比如可以通过调用“http://www.baidu.com/s?wd=静态页搜索site:www.cfsoft.com.cn”来达到搜索笔者网站网站中有关“静态页搜索”的内容。这种方式的优点是简单, 但有一个致命的缺点就是并不能搜索所有页面。由于百度并不能收录所有的页面, 特别对于中小网站收录页面往往都少得可怜, 甚至有的由于种种原因一页没有都是常有的事。另外还有一点搜索网站的页面更新都有一定的时间间隔, 更新的内容有时要过很久才能反应在搜索网站的结果里。
1.2 通过网页内容进行搜索
这种方式实现简单, 对搜索过程进行一定的优化处理, 借助数据库作中介, 不管在功能还是速度上都能达到非常理想的效果, 本文所介绍的站内搜索程序就是采用这种方式完成的。
2 原理
在讲解站内搜索程序前首先来了解一下该程序需要用到的数据库表结构。该程序需要用到两个表, 其中config这个表用来存储有关检测更新等相关的调度参数, 结构如表1所示。pageinfo用来存储提取到的页面信息, 结构如表2所示。
程序在第一次运行时首先遍历网站目录 (指定排除的目录除外) 下的所有文件, 检查扩展名是否在需要搜索的文件类型中, 如果是搜索的时候直接通过SQL语句查询pageinfo表的title和text字段, 搜索出所要的内容。程序支持空格连接多个关键词的or组合条件和加号连接的and组件条件搜索。
3 搜索类实现
3.1 类全局变量与对象说明 (如表3所示)
3.2 类属性说明
(1) 用于取提搜索结果描述信息的属性
(2) 用于取得分页链接的属性
(3) 用于读取搜索结果的属性
(4) 用于设置分页大小的属性
(5) 用于设置当前页的属性
(6) 用于设置搜索排除目录的属性
(7) 用于设置搜索文件扩展名的属性
3.3 类方法说明
(1) 类构造方法
(2) 搜索类实现主方法
外部通过调用类的search方法将需要搜索的关键词传入并完成搜索。
(3) 用来检查页面更新并提取网页TITLE和读取网页内容
(4) 提取网页内容
(5) 检测目录是否允许被查询
(6) 检测文件类型是否允许被查询
4 调用说明
5 性能测试
测试环境:Windows 2003+IIS6+Access 2003
总文件数:5852
静态页面数:3201
第一次运行 (整站静态页全部提取) :42280.1毫秒
第二次运行 (只提取更新内容, 其中有54页更新) :2900毫秒
第三次运行 (未到检测更新间隔时间, 直接从数据库搜索) :130.1毫秒
6 结语
经过多次测试搜索除第一次的时间有点长外, 其他时间搜索速度非常理想, 完全可以满足日常站内搜索需要, 对于页面数在5000以下的搜索延时一般只有100多毫秒。对于页面数量特别大的网站改用SQL Server作数据库也能获得非常理想的搜索效果。
摘要:介绍ASP实现的网站整站静态页搜索引擎程序, 该程序通过递归遍历网站目录每一个文件, 提取网页标题和去除标签后的网页内容存入数据库中, 并定期检测网页更新情况, 当用户搜索时程序直接对数据库进行搜索。该程序具有搜索功能强大、无需人工维护、搜索速度快等优点。
关键词:搜索引擎,FSO,ASP,静态页,分页索引表,正则表达式
参考文献
[1]邱李华, 曹青, 郭志强.Visual Basic程序设计教程.机械工业出版社, 2007.
[2]明日科技.ASP开发技术大全 (附光盘) .人民邮电出版社, 2007.
ASP实现网站智能分词搜索 第3篇
关键词:ASP.NET;验证码;实现机制;网站安全
中图分类号:TP311 文献标识码:A文章编号:1007-9599 (2011) 15-0000-02
ASP.NET-Based Site Authentication Code Technology Using and Research
Yin Zhijie
(Tibet Vocational Technical College,Lasa850000,China)
Abstract:Code technology is to prevent automated bots to register and sign-effective method of attack,the article describes the role of the verification code and implementation mechanism,and use C# to achieve a common procedure to achieve the verification code,and describes use verification code technology issues that need attention
Keywords:ASP.NET;Verification code;Implementation mechanism;Site security
一、引言
Web网站验证用户的合法性的传统方法是要求用户在客户端输入用户名和密码。提交到服务器端后再确认其合法性。但是一些别有用心的用户利用机器人程序自动地进行登录、批量注册。或通过像穷举密码破解和字典密码破解之类的攻击方法来自动探测合法的用户名和密码,从而对网站安全造成了极大的威胁。也大大降低了网站响应速度。验证码技术正是为了防止机器人程序此类攻击而提出的。目前几乎所有网站在用户登录和注册时都采用了验证码技术。
二、验证码技术的实现
(一)在实现验证码时,一般都使用专门的页面创建验证码,产生验证码的页面文件名为VerifyCode.aspx,在实现验证码功能时,为了达到最佳效果,减少具有不良用心的人使用机器识别验证码而出现的不安全因素,在实现时采用了汉字作为验证码载体,提高了机器识别的难度,并且使用随机字体、随机颜色、随机字体样式、随机笔刷类型的方式,使产生的验证码图片被机器识别的可能性大幅度降低,VerifyCode.aspx的关键代码如下:
public void Page_Load(object sender,System.EventArgs e)
{if(!IsPostBack)
{
//初始化随机数
this._random=new Random();
this._code=GetRandomCode();
Session["code"]=this._code;
this.SetPageNoCache();
this.OnPaint();
}
}
//设置页面不被缓存
private void SetPageNoCache()
{
Response.Buffer=true;
Response.ExpiresAbsolute=System.DateTime.Now.AddSeconds(-1);
Response.Expires=0;
Response.CacheControl="no-cache";
Response.AppendHeader("Pragma","No-Cache");
}
//取得一个4位的随机码
private string GetRandomCode()
{return Guid.NewGuid().ToString().Substring(0,4);}
//随机取一个字体
private Font GetFont()
{
int fontIndex=_random.Next(0,FontItems.Length);
FontStyle fontStyle=GetFontStyle(_random.Next(0,2));
return new Font(FontItems[fontIndex],12,fontStyle);
}
//取一个字体的样式
private FontStyle GetFontStyle(int index)
{switch(index)
{
case 0:
return FontStyle.Bold;
case1:
return FontStyle.Italic;
default:
return FontStyle.Regular;
}
}
//随机取一个笔刷
private Brush GetBrush()
{
int brushIndex=_random.Next(0,BrushItems.Length);
_brushNameIndex=brushIndex;
return BrushItems[brushIndex];
}
//绘画事件
private void OnPaint()
{Bitmap objBitmap=null;
Graphics g=null;
try{
objBitmap=new Bitmap(Width,Height);
g=Graphics.FromImage(objBitmap);
Paint_Background(g);
Paint_Text(g);
Paint_TextStain(objBitmap);
Paint_Border(g);
objBitmap.Save(Response.OutputStream,ImageFormat.Gif);
Response.ContentType="image/gif";
}
catch{}
finally
{if(null!=objBitmap)bjBitmap.Dispose();
if(null!=g).Dispose();
}
}
//绘画背景颜色
private void Paint_Background(Graphics g)
{g.Clear(BackColor);}
//绘画边框
private void Paint_Border(Graphics g)
{g.DrawRectangle(BorderColor,0,0,Width-1,Height-1);}
//绘画文字
private void Paint_Text(Graphics g)
{g.DrawString(_code,GetFont(),GetBrush(),3,1);}
//绘画文字噪音点
private void Paint_TextStain(Bitmap b)
{for(int n=0;n<30;n++)
{int x=_random.Next(Width);
int y=_random.Next(Height);
b.SetPixel(x,y,Color.FromName(BrushName[_brushNameIndex]));
}
}
(二)验证码的使用。使用时在需要验证码的页面上创建一image控件,并设置其ImageUrl属性值为VeifyCode.aspx路径即可。验证时服务器将用户提交的验证码与用Session保存的验证码进行比较,这里不再赘述。
三、编写验证码程序时应该注意的事项
但在代码书写的时候,程序员处理不当,可能造成验证码形同虚设。在注册功能上,验证码功能失效会造成批量注册漏洞;在登录功能上,验证码功能失效会造成暴力破解漏洞,为避免产生以上风险,在编写验证码程序时要注意以下几点:
(一)不允许用户输入空的验证码。在需要检查用户重复操作的方法中,遇到用户输入了空的驗证码,立即返回。这是因为,空的验证码很有可能是黑客不经过前台页面直接把数据提交给后台处理程序的结果。
(二)如果使用COOKIES存储验证码,不能使用明文。对于黑客来讲,COOKIES是看得见摸得着的,只要在地址栏里输入javascript:alert(document.cookie);就能看到当前站点的COOKIES信息。如果COOKIES以明文存储验证码,那黑客仍然可以编写程序获得这个验证码,进行反复提交,验证码功能还是形同虚设。如果使用SESSION,则可避免这个问题。
(三)用户操作成功后立即删除验证码COOKIES或SESSION,避免用户使用同一验证码进行重复操作。
(四)如果使用COOKIES,验证码与IP的对应列表应存在服务器一份。这个方法是为了防止COOKIES欺骗。即,黑客可能提交了一个伪造的COOKIES验证码。
参考文献:
[1]韩玉民.验证码技术研究及基于ASP.NET的实现[J].开发案例,2009,8
[2]刘明,陈治.ASP.NET中动态生成验证码图片的方法研究[J].信息技术,2009,9
[3]李乃文等编著.C#程序设计实践教程[M].北京:清华大学出版社,2007
ASP实现网站智能分词搜索 第4篇
关键词:全文搜索,中文分词,搜索引擎,Lucene
基于关键字的文本搜索是信息系统最重要最常用的功能之一,而开放源代码的Lucene全文检索技术是信息检索领域广泛使用的基本技术,被大量的集成到各种系统软件以及构建Web应用系统中去,作为软件的全文检索子系统的核心。基于关键字的文本搜索首先要解决分词问题,虽然Lucene内置了分词器功能,但无法支持复杂的中文分词。因此,本文在比较各类中文分词器的基础上,采用PaodingAnalyzer分词器代替Lucene内置分词器,与Lucene共同构建起一个中文环境下高效、准确的全文搜索引擎系统。
1 关键技术
1.1 Lucene
Lucene是apache软件基金会jakarta项目组下的一个子项目,是一个开放源代码的全文检索引擎工具包[1]。作为一个开放源代码项目,Lucene发布后,引发了开放源代码社区的热烈反应,开发者不仅使用它构建具体的全文检索应用,而且将Lucene整合到各种系统软件以及各种Web应用中,甚至也有商业软件也采用Lucene作为其全文检索子系统的核心。
采用Lucene构建全文搜索引擎不仅在于其开源、免费,而且在于高性能、纯JAVA跨平台应用,方便移植可重用;Lucene作为一个全文检索引擎,其突出的技术应用优势是不仅在传统全文检索引擎的倒排索引的基础上,实现了分块索引,而且设计了独立于语言和文件格式的文本分析接口;还实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力。
1.2 PaodingAnalyzer中文分词器
当前基于Lucene的中文分词器主要有PaodingAnalyzer、imdict、mmseg4j、ik等四种。从是否支持用户自定义词库、运行速度、算法与代码复杂度、开发者与开发社区活跃度等方面综合分析权衡,本系统最终采用PaodingAnalyzer分词器来实现中文分词功能。
PaodingAnalyzer中文分词器,又称庖丁解牛中文切词器[2]。PaodingAnalyzer基于Java的开源中文分词组件,提供lucen和solr接口,具有极高效率和高扩展性。它采用基于不限制个数的词典文件对文章进行有效切分,支持最大/最小切词。字典灵活且文件个数不限、名称不限、只要符合以dic作为扩展名的文件均视为字典。可以根据需要加减字典目录以及目录下的字典。
2 系统设计与实现
在本搜索引擎系统中,采用基于Lucene全文检索引擎开源项目为系统开发核心,并整合PaodingAnalyzer中文分词器以解决Lucene中不支持中文分词问题,系统由三大模块组成:文件索引模块、搜索查询模块与搜索结果排序与显示模块。
系统的工作流程是,首先对通过爬虫等方法收集起来的所有文档建立索引;其次是设计开发查询分析器对用户查询请求进行分词与匹配查找;最后把查找结果通过排序算法与关键字高亮显示等方式反馈到查询客户端。各模块工作原理与相互协作流程系统整体框架图如图1所示:
2.1 文件索引
系统中待索引文件可用网络爬虫,手工等方式收集,文件格式可以为html、doc、ppt、xls、pdf、txt等文档。在建立文件索引前首先必须通过文件格式转换器对特定的文件格式采用相对应的解释类对文档进行格式转换与清洗,如PDF格式文件通过PDFBox类解释,Word和Excel通过POI类解析,并最终将文档内容转换成字节流。建立索引之前必须进行中文分词,Pa odingAnalyzer中文分词器对通过格式转换器生成的字节流进行中文分词处理。最后通过索引创建器中Lucene索引类中In dexWriter方法对所有文档建立索引并对索引进行存储,在索引结束时使用Lucene的wirter.optimize()方法优化索引。索引创建过程如图1中的系统工作流程图所示。
2.2 搜索查询
在客户端输入查询关键字后,首先使用中文分词器接收传递过来的查询数据,进行合理的中文分词处理,再使用分割的最后将结果反馈回客户端。
Lucene中IndexSeacher类是搜索操作的入口,所有搜索操作都是通过IndexSeacher实例使用一个重载的search方法来实现。具体的Query子类为每一种特定类型的查询进行逻辑上的封装。Query实例被传递到IndexSearcher的search方法中。QueryParser将用户输入的查询表达式处理为一个具体的Query对象。
2.3 搜索结果处理
通过关键字搜索,获取文档的URL,并利用文件系统解析到结果界面。Lucene的默认搜索结果排序是按照文档的得分进行排序的。当检索结果集中有两个文档具有相同的得分时,默认按照文档的ID对结果进行排序。还可以使用Sort排序工具实现个性化排序,方法如下:Lucene在查询的时候,可以通过以一个Sort作为参数构造一个检索器IndexSearcher,在构造Sort的时候,指定排序规则。
Lucene搜索结果分页,与读取数据库表的分页类似,每次仅取出前10条记录,这样避免了内存溢出的可能,但是每次搜索都要进行一次IO操作,如果大并发访问的情况下,对服务器硬盘的转速与处理器的频率性能要求较高。
在搜索结果页面中,还使用关键字加粗高亮显示。在org apache.Lucene.search.highlight包中提供了关于高亮显示检索关键字的工具。
3 系统测试
选择html、doc、pdf、txt四种类型文档各10份,每份文档文本包含“计算机科学技术”相关内容,首先对文档进行中文分词,然后对其建立中文索引,最后使用关键字搜索。测试的结果如下:
PaodingAnalyzer中文分词器对“计算机科学技术”分词后的结果是:计算计算机计算科学科学技术科学技术计算科学计算技术。中文分词器基本符合分词要求。在客户端输入以上相关的关键字搜索,都能成功搜索出有相关内容的测试文档机及内容。
4 结束语
基于Lucene的中文分词全文搜索引擎系统经过测试,性能较为稳健,准确率也较高,基本满足中文环境下的搜索需求,但文件的索引速度与构建实时索引方面还有较大的完善空间,其次,搜索查询速度较为缓慢,主要原因是每次运行,都会进行索引的加载,影响了性能,后期将对其进行缓存,可大幅度提升搜索的速度。
参考文献
[1]管建,甘剑峰.基于Lucene全文检索引擎的应用研究与实现[J].计算机工程与设计,2007(2).
ASP实现网站智能分词搜索
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。


