我的博客网站开发6——博文关键字搜索

在页面中,用户可以通过关键字的搜索功能搜索博文。可以实现类似百度和Google的页面搜索功能,可实现多个关键字的搜索。搜索后,在搜索的结果中有关键字的高亮度的提示如:

在搜索的结果页面,模仿Google的搜索页面的快照功能,实现简单的快照查看搜索博文的功能。点击搜索页的快照按钮,页面右侧会出现博文的内容,如:

搜索页的基本功能实现。

接下来就是功能逻辑代码的实现部分。

首先要解决一个基本的问题就是:如何传送多个关键字进行查询。

我最初的想法是既然是多个关键字的搜索,类似百度和Google的搜索的话,我感觉就应该用一个数组来装载这些关键字,加以区分这些关键字的是空格,然后将其使用spilit函数对字符串进行拆分分割,使用数组对分割后的关键字装载。装载后的数组进行字符串的拼凑形成SQL语句,传回数据库进行模糊查询。

首先在博客首页的搜索功能中输入关键字,如:

C#代码:

 1  string SQLstr; //拼凑SQL语句
 2             string keyword = Server.UrlDecode(Request.QueryString["keyword"]);//接收原跳转页面传回的关键字字符串
 3             char[] separator={' '};
 4             string[] keywordArray = keyword.Split(separator);
 5             DataTable dt_CloneKeywordSearch;//克隆dt_KeywordSearch
 6             if (keyword != null)
 7             {
 8                 SQLstr = " where  title like '%" + keywordArray[0].ToString() + "%'" + "or essayContent like'%" + keywordArray[0].ToString() + "%'";
 9                 for (int i = 1; i < keywordArray.Length; i++)
10                 {
11                     SQLstr += "or title like'%" + keywordArray[i].ToString() + "%'" + "or essayContent like'%" + keywordArray[i].ToString()+"%'";
12                 }
13                 DataTable dt_KeywordSearch = BLL.BLL_BlogSearch.Select_KeywordSearch(SQLstr);   
14             }

实现关键字的处理传回数据库查询出结果后,接下来就是数据的相关处理,包括对查询结果的数据绑定,关键字的高亮度显示。

Html代码:

View Code
 1 <div style=" background:#FFFFFF; float:left; width:50%;">
 2     <asp:GridView ID="gdv_KeywordSearch" runat="server" AutoGenerateColumns="False" 
 3         BorderStyle="None" GridLines="None" ShowHeader="False" AllowSorting="True">
 4         <Columns>
 5             <asp:TemplateField>
 6                 <ItemTemplate>
 7                 <div class="dgv_block" style=" border-bottom:dashed 1px #000000; height:auto; float:left; width:100%;">
 8                     <div style=" margin:5px 5px 5px 5px; line-height:1.2em; width:90%; float:left;">
 9                         <div id="search_title" style=" text-align:left; color:#261cdc; font-family:Verdana; font-size:14px;"><%# DataBinder.Eval(Container.DataItem, "title") %></div>
10                         <div id="search_content" style=" text-align:left; font-family:Verdana; font-size:12px; margin-top:5px;"><%# DataBinder.Eval(Container.DataItem, "essayContent")%></div>
11                         <div id="search_contentTime" style=" text-align:left;margin-top:5px;"><%# DataBinder.Eval(Container.DataItem, "essaypostTime")%></div>
12                     </div>
13                     <div class="div_QuickLook" style="width:6%; height:100%; float:right; vertical-align:middle;">
14                     <span class="QuickLook" id="<%# DataBinder.Eval(Container.DataItem, "essayId") %>" style=" color:#261cdc; font-size:14px; font-weight:bold;">快<br />照</span>
15                     </div>
16                 </div>
17                 </ItemTemplate>
18             </asp:TemplateField>
19         </Columns>
20     </asp:GridView>
21     </div>

后台CS的C#代码:

View Code
 1  for (int i = 0; i < dt_KeywordSearch.Rows.Count; i++)
 2                 {
 3                     //截取正文content前300字
 4                     string str_Content = dt_KeywordSearch.Rows[i]["essayContent"].ToString().Trim();
 5                     dt_KeywordSearch.Rows[i]["essayContent"] = RemoveHTML(str_Content.Substring(0, str_Content.Length > 300 ? 300 : str_Content.Length));//去除html标记
 6 
 7                     //关键字高亮度显示
 8                     dt_KeywordSearch.Rows[i]["title"] = keyword_tag(dt_KeywordSearch.Rows[i]["title"].ToString().Trim(), keywordArray);
 9                     dt_KeywordSearch.Rows[i]["essayContent"] = keyword_tag(dt_KeywordSearch.Rows[i]["essayContent"].ToString(), keywordArray);
10                 }
11 
12                 //查询结果数据绑定
13                 this.gdv_KeywordSearch.DataSource = dt_KeywordSearch;
14                 gdv_KeywordSearch.DataKeyNames = new string[] { "essayId" };
15                 gdv_KeywordSearch.DataBind();
16 
17         //关键字高亮度提示
18         public string keyword_tag(string str, string[] keywordArray)
19         {
20             for(int i=0;i<keywordArray.Length;i++)
21             {
22                 str = str.Replace(keywordArray[i], "<font color='#ff0000'>" + keywordArray[i] + "</font>");
23             }
24             return str;
25         }
26 
27         //摘要中去除html标记
28         public static string RemoveHTML(string Htmlstring)
29         {
30             //删除脚本   
31             Htmlstring = Regex.Replace(Htmlstring, @"<script[^>]*?>.*?</script>", "", RegexOptions.IgnoreCase);
32             //删除HTML   
33             Htmlstring = Regex.Replace(Htmlstring, @"<(.[^>]*)>", "", RegexOptions.IgnoreCase);
34             Htmlstring = Regex.Replace(Htmlstring, @"([\r\n])[\s]+", "", RegexOptions.IgnoreCase);
35             Htmlstring = Regex.Replace(Htmlstring, @"-->", "", RegexOptions.IgnoreCase);
36             Htmlstring = Regex.Replace(Htmlstring, @"<!--.*", "", RegexOptions.IgnoreCase);
37 
38             Htmlstring = Regex.Replace(Htmlstring, @"&(quot|#34);", "\"", RegexOptions.IgnoreCase);
39             Htmlstring = Regex.Replace(Htmlstring, @"&(amp|#38);", "&", RegexOptions.IgnoreCase);
40             Htmlstring = Regex.Replace(Htmlstring, @"&(lt|#60);", "<", RegexOptions.IgnoreCase);
41             Htmlstring = Regex.Replace(Htmlstring, @"&(gt|#62);", ">", RegexOptions.IgnoreCase);
42             Htmlstring = Regex.Replace(Htmlstring, @"&(nbsp|#160);", "   ", RegexOptions.IgnoreCase);
43             Htmlstring = Regex.Replace(Htmlstring, @"&(iexcl|#161);", "\xa1", RegexOptions.IgnoreCase);
44             Htmlstring = Regex.Replace(Htmlstring, @"&(cent|#162);", "\xa2", RegexOptions.IgnoreCase);
45             Htmlstring = Regex.Replace(Htmlstring, @"&(pound|#163);", "\xa3", RegexOptions.IgnoreCase);
46             Htmlstring = Regex.Replace(Htmlstring, @"&(copy|#169);", "\xa9", RegexOptions.IgnoreCase);
47             Htmlstring = Regex.Replace(Htmlstring, @"&#(\d+);", "", RegexOptions.IgnoreCase);
48 
49             Htmlstring.Replace("<", "");
50             Htmlstring.Replace(">", "");
51             Htmlstring.Replace("\r\n", "");
52             Htmlstring = HttpContext.Current.Server.HtmlEncode(Htmlstring).Trim();
53 
54             return Htmlstring;
55         }

接下来是实现鼠标经过每个结果时,显示“快照”按钮,离开时隐藏,js代码实现。

Js代码:

 1 $(".div_QuickLook").hide(); //隐藏快照标志
 2         //经过时显示快照标记,离开时隐藏
 3         $(".dgv_block").mousemove(function () {
 4             $(this).children(".div_QuickLook").show();
 5         });
 6         $(".dgv_block").mouseleave(function () {
 7             $(this).children(".div_QuickLook").hide();
 8         });
 9 
10         $(".QuickLook").hover(function () {
11             $(this).css({ "color": "#FF0000" });
12         }, function () {
13             $(this).css({ "color": "#261cdc" });
14         });

最后是点击快照时,显示文章的全部内容,其实质就是查询绑定数据。处理的小问题就是动态异步加载数据,使用Ajax实现异步刷新。

Html代码:

1  <div id="QuickLookPage" style=" float:right; width:49%; text-align:left; overflow:hidden; background:#FFFFFF;">
2     </div>

Js的Ajax实现异步加载数据:

 1 $(".QuickLook").click(function () {
 2             $("#QuickLookPage").html(""); //每次加载快照时,先清空
 3             var $essayId = $(this);
 4             $(this).parent().siblings().children("#search_title").clone().appendTo($("#QuickLookPage"));
 5             var options = {
 6                 type: "POST",
 7                 url: "BlogSearch.aspx/GetQuickLook",
 8                 data: "{essayId:" + $essayId.attr("id") + "}",
 9                 contentType: "application/json;charset=urf-8",
10                 dataType: "json",
11                 success: function (response) {
12                     $("#QuickLookPage").append("<div style='margin-top:10px; padding:0px 5px 5px 5px;'>" + response.d + "</div>");
13                 }
14             };
15             $.ajax(options);
16         });

后台CS的C#代码:

1 [WebMethod]
2         public static string GetQuickLook(string essayId)
3         {
4             DataTable dt_QuickLook = BLL.BLL_BlogSearch.Select_QuickLook(essayId);
5 
6             return dt_QuickLook.Rows[0]["essayContent"].ToString().Trim();
7         }

自此,搜索功能基本实现,实现多关键字查找。

不足之处:未对搜索算法进行优化,页面的布局和设计还未完善,会在以后不断完善它。

 

转载于:https://www.cnblogs.com/suguoqiang/archive/2012/05/07/2487373.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell 函数定义和调用

为什么80%的码农都做不了架构师&#xff1f;>>> 一. 函数定义 语法&#xff1a; [function] functionname[()]{action;[return int;] } 说明&#xff1a; 1、可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。 2、参数返回&#xff0c;可…

Nhibernate代码生成器v2.1中文版

Nhibernate代码生成器v2.1中文版(转发)下载转载于:https://www.cnblogs.com/hakuci/archive/2008/03/15/1106802.html

Head First设计模式读书笔记——策略模式

问题描述&#xff1a; 目前的任务是实现一个FPS类游戏的各种角色&#xff08;友军、敌军、平民和狗、猫、鸭子等动物&#xff09;以及他们的各种行为&#xff08;攻击、游泳等&#xff09;。 设计方案一 很简单&#xff0c;只要实现一个角色超类&#xff0c;将角色的各种行为放…

centos+bond+bridge+docker(ssh容器)固定ip实现测试环境(一)

硬件&#xff1a;R730交换机&#xff1a;H3C Switch S5120-28P-SI系统&#xff1a;centos7#nmtuihttp://568273240.blog.51cto.com/802.3ad为LACP模式交换机部分&#xff1a;# systemctl restart network可以多重启几遍试下。http://568273240.blog.51cto.com/注意&#xff1a;…

简单线性回归算法

为什么80%的码农都做不了架构师&#xff1f;>>> /*** 简单线性回归算法* param array y轴数据* param array x轴数据* returns array(slope,intercept,r2)*/ function linearRegression(y, x) {var lr {};var n y.length;var sum_x 0;var sum_y 0;var sum_xy …

模拟BS服务器

一、模拟BS服务器分析 二、BS模拟服务器代码实现 图片都是单独请求&#xff0c;后台单独线程&#xff0c;这边是通过构造方法传入的Runable接口的实现类匿名对象创建线程&#xff1b; 创建本地输入流读取到网络输出流传过来的信息再放到网络输出流中返回&#xff1b; 转载于:ht…

不要62

题目 试题描述杭州人称那些傻乎乎粘嗒嗒的人为 62&#xff08;音&#xff1a;laoer&#xff09;。杭州交通管理局经常会扩充一些的士车牌照&#xff0c;新近出来一个好消息&#xff0c;以后上牌照&#xff0c;不再含有不吉利的数字了&#xff0c;这样一来&#xff0c;就可以消除…

CentOS 7 下的 Firewall

CentOS 7 默认实用的用Firewalld作为防火墙&#xff0c;摒弃了原先的iptables。但是内核还是使用iptable作为管理参考文档https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.htmlhttp://www.myhome.net.tw/2…

POJ 1091(数论)

题目大意是给定两个整数n和m&#xff0c;求出长度为n1满足条件的数列data的个数&#xff0c;数列的要求下&#xff1a;1&#xff09;1<data[i]<m,for1<i<n2)data[n1]m;3&#xff09;这个n1个数满足&#xff1a;存在x1,x2,...,xn,xn1,满足x1*data[1]x2*data[2]...x(…

没有动任何配置文件,今天就出现了修改的JSP内容在页面不体现。依然是老的页面内容...

2019独角兽企业重金招聘Python工程师标准>>> 现象&#xff1a; 没有动任何配置文件&#xff0c;今天就出现了修改的JSP内容在页面不体现。依然是老的页面内容 问题分析: 既然可以用过&#xff0c;所以系统应该是检测文件更新的&#xff0c;之所以不重新编译JSP&…

PWA

转载于:https://www.cnblogs.com/QianDingwei/p/11359160.html

Windows XP SP3?转自作者: 孤单的鸽子,  出处:天极yesky, 责任编辑: 袁绍龙

经过测试和检查之后&#xff0c;我们认为&#xff0c;SP3并未为Windows XP系统引入任何新的功能&#xff0c;它仅仅是一款安全升级和BUG修正补丁程序集……原文&#xff1a;http://winsystem.ctocio.com.cn/windowsxp/321/7492821.shtml目前&#xff0c;互联网上围绕Windows XP…

创建表头固定,表体可滚动的GridView(转)

本方法只需要设置一个GridView的宽度&#xff0c;其它宽度不需要设置。测试环境&#xff1a;IE6&#xff0c;Firefox通过。 C# <% Page Language"C#" AutoEventWireup"true" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/…

3G与4G到底有何区别?

对每一个手机用户来说&#xff0c;3G和4G都是手机术语词典中最神秘的词汇&#xff0c;然而在任何卖手机和平板电脑的地方你都能发现它们的身影。当你想买一部手机的时候&#xff0c;通常不清楚该选择哪一种&#xff0c;但有一点要明确——不要随便追求高的数字。这篇文章将帮助…

海尔5D净水洗热水器引领中国制造未来

在过去的一段时间里&#xff0c;智能家居与物联网相继成为热潮&#xff0c;云计算与大数据开始被应用于不同领域的情况下&#xff0c;越来越多的智能家居产品也开始走入普通消费者生活之中……在这些独特的产业创新风起云涌的情况下&#xff0c;越来越多的行业开始推动着中国制…

Lambda表达式——注重过程的编程思想

一、使用匿名内部类的匿名对象创建线程和Lambda表达式写法 Lambda表达式写法不用去定义一个Runable接口的实现类&#xff1b; 二、方法入参是一个接口或者接口的实现类 三、对某个类的一些对象实例进行排序 其中&#xff0c;数组创建时候使用的是静态初始化&#xff0c;里面存放…

[转] STL中map用法详解

一&#xff0e;Map概述 Map是STL的一个关联容器&#xff0c;它提供一对一&#xff08;其中第一个可以称为关键字&#xff0c;每个关键字只能在map中出现一次&#xff0c;第二个可能称为该关键字的值&#xff09;的数据处理能力&#xff0c;由于这个特性&#xff0c;它…

HDU 1874 畅通工程续

畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9566 Accepted Submission(s): 3200 Problem Description某省自从实行了很多年的畅通工程计划后&#xff0c;终于修建了很多路。不过路多了也不好&am…

转换流

一、编码和解码 二、编码带来的问题 三、转换流InputStreamReader和OutputStreamWriter编码和解码的原理 看懂的字符变成看不懂的字节编码 和 把看不懂的字节编码变成看懂的字符&#xff1b; 字节和字符转换的桥梁&#xff0c;不写默认utf-8&#xff08;国际规定&#xff09;&a…

序列化流

一、对象的序列化和反系列化 二、对象的序列化流ObjectOutputStream 标记型接口&#xff1a; 使用序列化流ObjectOutputStream将对象写入到文件中进行序列化&#xff1a; 执行过后的文件&#xff1a; 二进制字节存储&#xff0c;无法直接查看&#xff1b; 三、对象的反序列化流…