分享

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

 昵称13176349 2013-07-15

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

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

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

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

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

第二:Lucene.Net实现的方法

1Lucene.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、伪静态规则与实现

伪静态规则:    <rewrite url="^/list.(aspx|html|htm|shtm|shtml)$" to="/动态页面文件.aspx" processing="stop" />

<rewrite url="^/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" />

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多