怎么利用Lucene.Net搜索结果,实现伪静态的文章列表

来源:互联网 发布:java和c语言的区别 编辑:程序博客网 时间:2024/04/27 16:16

    大家都知道Lucene.Net是一款优秀的开源全文搜索引挚,笔者发现很多网站项目都使用该引挚,特别是开源的项目更是,显然Lucene.Net有着比其它开源全文搜索引挚更多的优势。具体的优势,网上有很多例子,这里就不谈了,有兴趣的网友可以自己搜索了解一下。今天的目的是:怎么把高性能的Lucene.Net全文搜索引挚和显示新闻列表结合起来,组成使用Lucene.Net技术,实现伪静态列表。实现之前先了解一下为什么要这样做?笔者就先从静态页面与伪静态页面谈起。

第一:使用Lucene.Net实现伪静态的前提问题?

    大家都知道为了更好的被各大搜索引挚更好的收录,都会把网站内容生成静态页面或伪静态页面。其中的静态与伪静态页面的优缺点,各位站长朋友都非常了解,这里笔者也深有体会,就简单谈一下。

1、静态页面访问快,收录效果也好,特别像我们这种苦逼站长,要自己托管服务器,相信很多站长和我一样,没有资金,网站能不能盈利还不知道!唉,那只能买虚拟空间,想提高访问速度快,就只能在程序上下点功夫,所以最好全站全部生成静态页面。但生成静态页面的首要条件是必须有能生成静态页面的功能程序,虽然市面上有很多CMS但,能满足个性化、专业化的,还是要自己动手写。我的上一篇文章也提到,像我的医院导航网就是自己手写代码,而非使用目录程序或CMS生成。任何事情有优势,必有劣势。如果数据量大,全站静态页面,需要空间更大,生成速度也会慢。例如:导航网站,还得分一些属性生成,按科室、地区、医院等级、医院类型、医院大全等,这都将生成庞大的静态页面,所以笔者网站除首页、医院地区导航、医院科室导航每天更新,其他页面只能一个星期更新一次,明显信息更新不及时。于是乎想起了伪静态,即能最更新及时,又能满足SEO的要求,接下谈一下我对伪静态的实践。

2、伪静态页面,优点笔者就不谈了,谈一下劣势。伪静态就是假的静态,通过重写组件实现。但还是要读取数据库中的数据,打开页面明显比纯静态页面慢了很多,用户体验不好。怎么才能更好的解决伪静态的劣势,笔者想了很多方法,像:升级空间、换空间商等等。升级空间,现在的主机商唉,站长朋友都深有体会吧,像40人合租的服务器,其实早就超过40人了。换空间商,现在网站备案,虽然不用再次备案,但还得邮寄资料等等,也很麻烦。怎么解决这些劣势呢?接下来笔者将使用Lucene.Net实现网站的伪静态列表,既能更新及时(前提是索引及时更新),打开速度又快,何乐而不为呢?

第二:Lucene.Net实现的方法

1、Lucene.Net生成索引

这个如果不懂的,请大家参看我的博文,怎么使用Lucene.Net生成索引

2、怎么实现伪静态列表

a、首先实现新闻列表示例(News表)从索引查询出来的动态页面功能,该表有以下字段(classid,tilte,content,adddate,author)。一般全文搜索是只有一个关键字,如果列表显示,还需加上除标题,还有更新日期、新闻类型的搜索条件。那就需要使用Lucene.Net搜索传递几个关键字,本示例传递(classid,keyword)有二个关键字,看以下后台代码:

本示例使用的Lucene.Net版本:2.0.0.4。

需要引用的命名空间有:

using Lucene.Net.Index;using Lucene.Net.Documents;using Lucene.Net.Analysis.Standard;using Lucene.Net.Search;using Lucene.Net.QueryParsers;using Lucene.Net.Analysis;protected List< SearchItem> SearchResult = null;//定义显示列表SearchResult =Search(classid, title, psize, currentpage, out totalcount);

 

请看Search功能定义:

///<summary>///检索(新闻信息列表)主要参数有:类型id,标题///</summary>///<param name="classid">新闻类型id</param>///<param name="keyword">关键字(可查询标题)</param>///<param name="pagesize">分页大小</param>///<param name="pageno">当前页码</param>///<param name="totalcount">返回总记录数</param>///<param name="eventTime"></param>///<returns></returns>public List<SearchItem> Search(string classid, string keyword, int pagesize, int pageno, out int totalcount) {            int _type_num = types.Length;            IndexSearcher[] searchers = new IndexSearcher[1];            //可以直接指定索引存储目录路径!            searchers[0] = new IndexSearcher(HttpContext.Current.Server.MapPath("索引存储目录"));            MultiSearcher search = new MultiSearcher(searchers);             BooleanQuery bq = new BooleanQuery();            if (classid!= "0")            {                Term Term_class = new Term("classid", classid); //这是特定的搜索,将显示指定的类型新闻内容                var termQuery = new TermQuery(Term_class);                bq.Add(termQuery, BooleanClause.Occur.MUST);            }            string[] fields = { "title" }; //定义需要查询的字段                Query query = MultiFieldQueryParser.Parse(keywords, fields, flags, new StandardAnalyzer()); //parser.Parse(keywords);                bq.Add(query, BooleanClause.Occur.MUST);//添加到条件                        Hits hits = search.Search(bq);            List<SearchItem> result = new List<SearchItem>();            totalcount = hits.Length();            if (totalcount > 0)            {                int i = (pageno - 1) * pagesize;                while (i < totalcount && result.Count < pagesize)                {                    SearchItem news = null;                        news = new SearchItem();                        news.Id = hits.Doc(i).Get("id");                        news.Title = hits.Doc(i).Get("title");news.Url = hits.Doc(i).Get("url");                        news.AddDate = hits.Doc(i).Get("adddate");                        result.Add(news);                        i++;                }                search.Close();                return result;            }            else                return null;        }

再看前台aspx文件代码:

<div class="list"><div class="list_tit"><h3>全    部</h3><div class="shoulu">分类下有 <span><%= totalcount %></span> 条新闻</div></div>             <%if (SearchResult != null)            {                for (int i = 0; i < SearchResult.Count; i++)                { %>            <div class="list_cont"><ul><li><a href="<%=SearchResult[i].Url%>" title="<%=SearchResult[i].Title%>" target="_blank"><%=SearchResult[i].Title%></a><p>update:<%=Convert.ToDateTime(SearchResult[i].AddDate).ToString("yy-MM-dd")%></p></li></ul></div>            <%}            } %>            </div>

以上显示的列表就是从索引文件读取的,这种速度比从数据库获取快,接下来怎么实现伪静态的方法。

B、伪静态规则与实现

伪静态规则:   

<rewriteurl="^/list.(aspx|html|htm|shtm|shtml)$"to="/动态页面文件.aspx"processing="stop" /><rewriteurl="^/list-p([0-9]+)c([0-9]+)d([0-9]+)t([0-9]+)l([0-9]+)r([0-9]+)n([0-9]+).(aspx|html|htm|shtm|shtml)$"to="/动态页面文件?classid=$1&keyword=$2&page=$3"processing="stop" />

综合A与B两个地方就能实现利用Lucene.Net搜索结果,组成文章列表的伪静态功能完成。本文为医院导航网原创,并首发地址医院导航网博客:http://www.19698.com/blog/post/6.html,如有转载,请注明作者与来源,并希望和广大的网友朋友互相交流学习!