资源描述
怎么利用Lucene.Net搜索结果,实现伪静态的文章列表大家都知道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 SearchResult = null;/定义显示列表SearchResult =Search(classid, title, psize, currentpage, out totalcount);请看Search功能定义:/ / 检索(新闻信息列表)主要参数有:类型id,标题/ / 新闻类型id/ 关键字(可查询标题)/ 分页大小/ 当前页码/ 返回总记录数/ / public List Search(string classid, string keyword, int pagesize, int pageno, out int totalcount) int _type_num = types.Length; IndexSearcher searchers = new IndexSearcher1; /可以直接指定索引存储目录路径! searchers0 = 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 result = new List(); 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文件代码:全 部分类下有 条新闻 %if (SearchResult != null) for (int i = 0; i a href= title= target=_blankupdate: 以上显示的列表就是从索引文件读取的,这种速度比从数据库获取快,接下来怎么实现伪静态的方法。B、伪静态规则与实现伪静态规则: 综合A与B两个地方就能实现利用Lucene.Net搜索结果,组成文章列表的伪静态功能完成。本文为医院导航网原创,并首发地址医院导航网博客:
展开阅读全文