﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-飛揚</title><link>http://www.cnblogs.com/xinzhyu/</link><description>--戒骄戒躁 虚心向上 qq 68740319 MSN xinzhyu#163.com</description><language>zh-cn</language><lastBuildDate>Sat, 26 Jul 2008 09:34:51 GMT</lastBuildDate><pubDate>Sat, 26 Jul 2008 09:34:51 GMT</pubDate><ttl>60</ttl><item><title>实际项目中简单工厂及委托的继承的使用</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/07/16/1244061.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Wed, 16 Jul 2008 02:55:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/07/16/1244061.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1244061.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/07/16/1244061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1244061.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1244061.html</trackback:ping><description><![CDATA[摘要: 最近在重构公司的电子商务网站,其中有个打折消费的功能.这里简单介绍下,比如,网站搞活动买二送一(以下称A),或者买二瓶其中价格低的一瓶半价(以下称B),.最初的设计是很粗糙的,因为之前网站是没有活动,后来增加一个活动,现在又要增加新的活动.从一开始的直接写代码,到后来的if else 判断打折条件,到现在又要添加新的打折,觉得这样的代码写的很粗糙,有种不爽的感觉.现在刚好有机会重构这里,就大概设计&nbsp;&nbsp;<a href='http://www.cnblogs.com/xinzhyu/archive/2008/07/16/1244061.html'>阅读全文</a><img src ="http://www.cnblogs.com/xinzhyu/aggbug/1244061.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41316/" target="_blank">[新闻]腾讯CEO马化腾:中国互联网业准备再过冬</a>]]></description></item><item><title>面向对象基础</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/07/06/1236835.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Sun, 06 Jul 2008 03:31:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/07/06/1236835.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1236835.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/07/06/1236835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1236835.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1236835.html</trackback:ping><description><![CDATA[<ol><li>什么是对象?对象是一个自包含的实体,用一组可识别的特性和行为来标识.
</li><li>什么是类? 类是具有相同属性和功能的对象的抽象的集合.
</li><li>什么是实例?实例就是一个真实的对象.实例化就是创建对象的过程,用new关键字来创建.new关键字用来在内存中申请一个空间存放数据.
</li><li>构造函数 默认一个无参数的构造函数,在new class的时候调用
</li><li>方法重载 可在不改变原方法的基础上增加功能,方法名相同,参数类型或个数有所不同
</li><li>字段是存储类要满足其设计所需要的数据,是与类相关的变量
</li><li>属性是一个方法,但在调用他们的代码看来他是一个字段,属性适合以字段的方式使用方法调用的场合(使用属性可以设置符合要求的的字段的值)
</li><li>Public 允许任何类访问 private 仅允许同一个类的成员访问,他的子类也不能访问,定义变量时默认为private,protected的子类可以访问基类
</li><li>封装:每个对象都包含它能进行操作所需要的所有信息,因此对象不必依赖其他对象来完成自己的操作 好处,减少耦合,内部可自由修改,具有清晰的对外接口
</li><li><div>继承代表了一种 "is-a"的关系,还可以理解为是对被继承者的特殊化,除了具备被继承者的特性外,还具备有自己的独有个性,他定义类之间如何关联共享.
</div><ol><li>子类拥有父类非private的属性和功能
</li><li>子类可以扩展父类没有的属性和功能
</li><li>子类还可以以自己的方式实现父类的功能(方法重写)
</li><li>子类不能继承基类的构造方法,只能被调用,可以使用base关键词
</li><li>继承使得所有子类公共的部分都放在了父类,使得代码得到共享,避免重复
</li><li>使得修改或扩展变得容易
</li><li>缺点,父类变则子类不得不变,破坏封装,父类实现的细节暴露给子类
</li><li>强耦合的关系,当2个类具备is-a的关系时,就可以考虑用继承
</li></ol></li><li><div>多态表示不同的对象可以执行相同的操作,但要通过他们自己的实现代码执行
</div><ol><li>子类以父类的身份出现
</li><li>子类工作的时候以自己的方式来实现
</li><li>子类以父类的身份出现的时候,子类特有的属性和方法不可以再使用
</li></ol></li><li>虚方法 virtual 为了让子类的实例完全接替来自父类的类成员,父类必须将该成员声明称虚拟的, 虚方法是按照运行时类型而非编译时类型进行动态绑定调用
</li><li>子类可以选择使用override关键字,来实现替换父类的实现,方法重写
</li><li><div>抽象类
</div><ol><li>类和方法前加上abstract,即抽象类和抽象方法
</li><li>抽象类不能实例化
</li><li>抽象方法是必须被子类重写的方法
</li><li>如果类中包含有抽象方法,那么类就必须定义为抽象类,不论是否还包含有其他一般方法
</li><li>抽象类拥有尽可能多的共同代码,拥有尽可能少的数据
</li><li>抽象类通常代表一个抽象概念,他提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的.
</li></ol></li><li><div>接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合
</div><ol><li>实现接口类就必须实现接口中的所以方法和属性
</li><li>一个类可以实现多个接口
</li><li>接口中的方法或属性前面不能有修饰符,方法没有方法体
</li></ol></li><li><div>抽象类与接口的区别
</div><ol><li>抽象类可以给出一些成员的实现,接口却不包含成员的实现
</li><li>抽象类中的成员可以被子类实现,而接口的成员需要类完成实现
</li><li>一个类只能继承一个抽象类,而可以接受多个接口
</li><li>类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象
</li><li>如果行为跨越不同类的对象,可使用接口,对于一些相似的类对象,用继承抽象类
</li><li>从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知道子类的存在,方法如何实现还不确认,预先定义
</li><li>通过重构改善既有代码设计
</li></ol></li><li><div>泛型是具有占位符的类接口结构和方法
</div><ol><li>使用泛型不需要装箱拆箱
</li></ol></li><li><div>委托与事件
</div><ol><li>委托是对函数的封装,可以当作给方法的特征指定一个名称.而事件是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程
</li><li>委托是一种引用方法的类型,一旦为委托分配了方法,委托将与方法具有相同的行为
</li><li>在发生其他类或对象关注的事情时,类或对象可通过事件通知他们</li></ol></li></ol><img src ="http://www.cnblogs.com/xinzhyu/aggbug/1236835.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41315/" target="_blank">[新闻]F8 Keynote Speech[多图]</a>]]></description></item><item><title>测试用word发表blog</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/07/04/1235665.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Fri, 04 Jul 2008 06:52:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/07/04/1235665.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1235665.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/07/04/1235665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1235665.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1235665.html</trackback:ping><description><![CDATA[<p>
 </p><p>  测试</p><img src ="http://www.cnblogs.com/xinzhyu/aggbug/1235665.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41314/" target="_blank">[新闻]奥运核心资源被分食 搜狐央视网谁忽悠谁？</a>]]></description></item><item><title>[大话设计模式]读书笔记之序</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/07/01/1232854.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Tue, 01 Jul 2008 01:52:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/07/01/1232854.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1232854.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/07/01/1232854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1232854.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1232854.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; &nbsp;最近买了园子里一位大哥出的书,大话设计模式,之前也买过园子里的几本书,比如设计之道,道不远人等,怎么发现里面都有个道字<img src="http://www.cnblogs.com/Emoticons/qface/055242240.gif"  alt="" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;道不远人也是刚刚到手,还没来得及看,<font face="Verdana">大话设计模式</font>已经由当当送出.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;2本书拿到手上一比,道不远人那个厚啊,还是先从薄的开始看起吧^^<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;话说好记性不如烂笔头,之前看过很多书,当时看了现在就忘了,要记录下点学习笔记了,这个是开篇,要逐步记录下读书笔记<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;看看自己有没毅力哈
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1232854.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41313/" target="_blank">[新闻]微软推新型搜索技术"BrowseRank"挑战谷歌</a>]]></description></item><item><title>如何为网站项目添加子项目</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/06/25/1229462.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Wed, 25 Jun 2008 03:25:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/06/25/1229462.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1229462.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/06/25/1229462.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1229462.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1229462.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 最近要给公司的电子商务网站添加个圈子的功能.网站功能本来就包含有新闻发布,会员管理,商品购物,后台管理等,现在又要再加上圈子的功能,网站项目越来越复<br />
杂,每次编译生成的dll超过100k.这样每次修改任何一个功能中的任何一个小问题都要上传整个dll,并导致整个website的首次访问的重新编译.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 之前也曾经想过,这些功能根据不同处于项目中的不同文件夹内,比如会员的会在member,后台管理的会在admin文件夹,新闻的会在news文件夹.这样的话如果vs支持按不同文件夹生成不同dll,那我每次修改不同功能的不同文件只要上传对应的dll就可以了,不再需要上传整个website的dll.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 不过想法是美好的,事实是残酷的.vs并不支持这样的功能.所以在功能直接交互和文件共享并不多的功能上,我采取了重新建立一个projects的方法,比如把后台管理剥离出来,新建一个admin的website,这个新的projects放在website的根目录下,然后修改文件编译生成dll后的目录为..\bin并且删除项目中的web.config.编译后访问,呵呵,真的可以访问了,并且达到了拆分项目的要求.倒是并不完美,还有手动修改很多设置,并且这2个项目中不能共享相同的master,和usercontrol,甚至是图片,js等,如果直接使用相对路径,那么视图模式下将不能正常显示,如果vs直接提供新建子项目的功能并能解决共享这些文件,该有多好啊.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;于是通过Google,找到一篇文章<font face="Verdana"><a href="http://blogs.msdn.com/webdevtools/archive/2006/07/01/652986.aspx,Creating">http://blogs.msdn.com/webdevtools/archive/2006/07/01/652986.aspx</font>,Creating</a> sub-projects in IIS with Web Application Projects,不幸的是文中提到的&#8220;Web Application Projects&#8221; add-in,我<span style="font-family: Verdana">Download了,but can't&nbsp;install!<br />
&nbsp;&nbsp;&nbsp;&nbsp; 虽然这样的应用程序我们无法制作,但是我们可以按照他的思路自己修改配置啊.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 发现他的方法,跟一开始我的做法是很类似的,不过他可以共享master和user control,为什么我的不能呢?<br />
&nbsp;&nbsp;&nbsp;&nbsp; 仔细翻看了一下,发现原来他在子项目中创建了虚拟目录比如 <a href="http://localhost/group">http://localhost/group</a>,所以之前使用<font face="Verdana">~/Group.Master</font>,只能访问本项目中的master,而现在则可以访问根目录中的master了,试试usercontrol,也可以了,呵呵,原理奥妙都在这个虚拟目录中呀.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 不过最后,还是觉得这样的方式不是很舒服,不知道大家有没什么好的办法,我在这里抛下砖.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本来想发在新手区的,但是我觉得这个应该是大部分程序员都会遇到的问题,把Web 应用程序分解为多个较小项目也有很多优点,不知道各位达人平时如何解决的?<br />
如果大家觉得放在首页不合适的话,我也会移开.</span></p>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1229462.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41312/" target="_blank">[新闻]2008年7月26日IT博客精选</a>]]></description></item><item><title>垂直搜索引擎蜘蛛</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/05/29/1209743.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Thu, 29 May 2008 02:31:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/05/29/1209743.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1209743.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/05/29/1209743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1209743.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1209743.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本以为蜘蛛很简单,根据一个url,抓取到html内容,然后根据正则匹配数据入库.却发现,越看资料越复杂,蜘蛛应该根据抓取相似页面自动生成抓取模板,而且蜘蛛还要支持cookies和会自登录等多种协议.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;页面解析方面,也不是简单的获得标题和内容那么简单,还要做dom解析,js解析,模拟浏览器的可视化抓取等等.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先从页面数据的抽取这方面入手研究吧.
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1209743.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41311/" target="_blank">[新闻]微软每年向Apache捐10万美元支持开源软件</a>]]></description></item><item><title>Lucene一些技巧</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/05/27/1208227.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Tue, 27 May 2008 03:11:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/05/27/1208227.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1208227.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/05/27/1208227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1208227.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1208227.html</trackback:ping><description><![CDATA[本文仅记录一些简单的使用方法，供初学者参考。 <br />
以下例子采用&nbsp;Lucene.NET&nbsp;1.9&nbsp;版本，可取去&nbsp;Lucene.Net&nbsp;下载。 <br />
<br />
1.&nbsp;基本应用 <br />
<br />
using&nbsp;System; <br />
using&nbsp;System.Collections.Generic; <br />
using&nbsp;System.Text; <br />
using&nbsp;Lucene.Net; <br />
using&nbsp;Lucene.Net.Analysis; <br />
using&nbsp;Lucene.Net.Analysis.Standard; <br />
using&nbsp;Lucene.Net.Documents; <br />
using&nbsp;Lucene.Net.Index; <br />
using&nbsp;Lucene.Net.QueryParsers; <br />
using&nbsp;Lucene.Net.Search; <br />
using&nbsp;Lucene.Net.Store; <br />
using&nbsp;Lucene.Net.Util; <br />
<br />
namespace&nbsp;ConsoleApplication1.Lucene <br />
{ <br />
&nbsp;&nbsp;public&nbsp;class&nbsp;LuceneTest <br />
&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;const&nbsp;string&nbsp;FieldName&nbsp;=&nbsp;"name"; <br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;const&nbsp;string&nbsp;FieldValue&nbsp;=&nbsp;"value"; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Directory&nbsp;directory&nbsp;=&nbsp;new&nbsp;RAMDirectory(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Analyzer&nbsp;analyzer&nbsp;=&nbsp;new&nbsp;StandardAnalyzer(); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;LuceneTest() <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;Index() <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(directory,&nbsp;analyzer,&nbsp;true); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.maxFieldLength&nbsp;=&nbsp;1000; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;1;&nbsp;i&nbsp;&lt;=&nbsp;100;&nbsp;i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;document&nbsp;=&nbsp;new&nbsp;Document(); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.Add(new&nbsp;Field(FieldName,&nbsp;"name"&nbsp;+&nbsp;i,&nbsp;Field.Store.YES,&nbsp;Field.Index.UN_TOKENIZED)); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.Add(new&nbsp;Field(FieldValue,&nbsp;"Hello,&nbsp;World!",&nbsp;Field.Store.YES,&nbsp;Field.Index.TOKENIZED)); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.AddDocument(document); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Optimize(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer.Close(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;Search() <br />
&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;QueryParser.Parse("name*",&nbsp;FieldName,&nbsp;analyzer); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(directory); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("符合条件记录:{0};&nbsp;索引库记录总数:{1}",&nbsp;hits.Length(),&nbsp;searcher.Reader.NumDocs()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;hits.Length();&nbsp;i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;docId&nbsp;=&nbsp;hits.Id(i); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;name&nbsp;=&nbsp;hits.Doc(i).Get(FieldName); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;value&nbsp;=&nbsp;hits.Doc(i).Get(FieldValue); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;score&nbsp;=&nbsp;hits.Score(i); <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("{0}:&nbsp;DocId:{1};&nbsp;Name:{2};&nbsp;Value:{3};&nbsp;Score:{4}",&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;+&nbsp;1,&nbsp;docId,&nbsp;name,&nbsp;value,&nbsp;score); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searcher.Close(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;} <br />
&nbsp;&nbsp;} <br />
} <br />
<br />
除了&nbsp;RAMDirectory，还可以使用&nbsp;FSDirectory。(注意&nbsp;FSDirectory.GetDirectory&nbsp;的&nbsp;create&nbsp;参数，为&nbsp;true&nbsp;时将删除已有索引库文件，可以通过&nbsp;IndexReader.IndexExists()&nbsp;方法判断。) <br />
<br />
从指定目录打开已有索引库。 <br />
private&nbsp;Directory&nbsp;directory&nbsp;=&nbsp;FSDirectory.GetDirectory("c:\index",&nbsp;false); <br />
<br />
将索引库载入内存，以提高搜索速度。 <br />
private&nbsp;Directory&nbsp;directory&nbsp;=&nbsp;new&nbsp;RAMDirectory(FSDirectory.GetDirectory(@"c:\index",&nbsp;false)); <br />
//或 <br />
//private&nbsp;Directory&nbsp;directory&nbsp;=&nbsp;new&nbsp;RAMDirectory(c:\index"); <br />
<br />
2.&nbsp;多字段搜索 <br />
<br />
使用&nbsp;MultiFieldQueryParser&nbsp;可以指定多个搜索字段。 <br />
<br />
Query&nbsp;query&nbsp;=&nbsp;MultiFieldQueryParser.Parse("name*",&nbsp;new&nbsp;string[]&nbsp;{&nbsp;FieldName,&nbsp;FieldValue&nbsp;},&nbsp;analyzer); <br />
<br />
IndexReader&nbsp;reader&nbsp;=&nbsp;IndexReader.Open(directory); <br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
<br />
3.&nbsp;多条件搜索 <br />
<br />
除了使用&nbsp;QueryParser.Parse&nbsp;分解复杂的搜索语法外，还可以通过组合多个&nbsp;Query&nbsp;来达到目的。 <br />
<br />
Query&nbsp;query1&nbsp;=&nbsp;new&nbsp;TermQuery(new&nbsp;Term(FieldValue,&nbsp;"name1"));&nbsp;//&nbsp;词语搜索 <br />
Query&nbsp;query2&nbsp;=&nbsp;new&nbsp;WildcardQuery(new&nbsp;Term(FieldName,&nbsp;"name*"));&nbsp;//&nbsp;通配符&nbsp; <br />
</cc>//Query&nbsp;query3&nbsp;=&nbsp;new&nbsp;PrefixQuery(new&nbsp;Term(FieldName,&nbsp;"name1"));&nbsp;//&nbsp;字段搜索&nbsp;Field:Keyword，自动在结尾添加&nbsp;* <br />
//Query&nbsp;query4&nbsp;=&nbsp;new&nbsp;RangeQuery(new&nbsp;Term(FieldNumber,&nbsp;NumberTools.LongToString(11L)),&nbsp;new&nbsp;Term(FieldNumber,&nbsp;NumberTools.LongToString(13L)),&nbsp;true);&nbsp;//&nbsp;范围搜索 <br />
//Query&nbsp;query5&nbsp;=&nbsp;new&nbsp;FilteredQuery(query,&nbsp;filter);&nbsp;//&nbsp;带过滤条件的搜索 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
BooleanQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;BooleanQuery(); <br />
query.Add(query1,&nbsp;BooleanClause.Occur.MUST); <br />
query.Add(query2,&nbsp;BooleanClause.Occur.MUST); <br />
<br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
<br />
4.&nbsp;设置权重 <br />
<br />
可以给&nbsp;Document&nbsp;和&nbsp;Field&nbsp;增加权重(Boost)，使其在搜索结果排名更加靠前。缺省情况下，搜索结果以&nbsp;Document.Score&nbsp;作为排序依据，该数值越大排名越靠前。Boost&nbsp;缺省值为&nbsp;1。 <br />
<br />
Score&nbsp;=&nbsp;Score&nbsp;*&nbsp;Boost <br />
<br />
通过上面的公式，我们就可以设置不同的权重来影响排名。 <br />
<br />
如下面的例子中根据&nbsp;VIP&nbsp;级别设定不同的权重。 <br />
Document&nbsp;document&nbsp;=&nbsp;new&nbsp;Document(); <br />
switch&nbsp;(vip) <br />
{ <br />
&nbsp;&nbsp;case&nbsp;VIP.Gold:&nbsp;document.SetBoost(2F);&nbsp;break; <br />
&nbsp;&nbsp;case&nbsp;VIP.Argentine:&nbsp;document.SetBoost(1.5F);&nbsp;break; <br />
} <br />
<br />
只要&nbsp;Boost&nbsp;足够大，那么就可以让某个命中结果永远排第一位，这就是百度等网站的"收费排名"业务。明显有失公平，鄙视一把。&nbsp;&nbsp; <br />
<br />
5.&nbsp;排序 <br />
<br />
通过&nbsp;SortField&nbsp;的构造参数，我们可以设置排序字段，排序条件，以及倒排。 <br />
<br />
Sort&nbsp;sort&nbsp;=&nbsp;new&nbsp;Sort(new&nbsp;SortField(FieldName,&nbsp;SortField.DOC,&nbsp;false)); <br />
<br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query,&nbsp;sort); <br />
<br />
排序对搜索速度影响还是很大的，尽可能不要使用多个排序条件。 <br />
<br />
6.&nbsp;过滤 <br />
<br />
使用&nbsp;Filter&nbsp;对搜索结果进行过滤，可以获得更小范围内更精确的结果。 <br />
<br />
举个例子，我们搜索上架时间在&nbsp;2005-10-1&nbsp;到&nbsp;2005-10-30&nbsp;之间的商品。 <br />
对于日期时间，我们需要转换一下才能添加到索引库，同时还必须是索引字段。 <br />
//&nbsp;index <br />
document.Add(FieldDate,&nbsp;DateField.DateToString(date),&nbsp;Field.Store.YES,&nbsp;Field.Index.UN_TOKENIZED); <br />
<br />
//... <br />
<br />
//&nbsp;search <br />
Filter&nbsp;filter&nbsp;=&nbsp;new&nbsp;DateFilter(FieldDate,&nbsp;DateTime.Parse("2005-10-1"),&nbsp;DateTime.Parse("2005-10-30")); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query,&nbsp;filter); <br />
<br />
除了日期时间，还可以使用整数。比如搜索价格在&nbsp;100&nbsp;~&nbsp;200&nbsp;之间的商品。 <br />
Lucene.Net&nbsp;NumberTools&nbsp;对于数字进行了补位处理，如果需要使用浮点数可以自己参考源码进行。 <br />
//&nbsp;index <br />
document.Add(new&nbsp;Field(FieldNumber,&nbsp;NumberTools.LongToString((long)price),&nbsp;Field.Store.YES,&nbsp;Field.Index.UN_TOKENIZED)); <br />
<br />
//... <br />
<br />
//&nbsp;search <br />
Filter&nbsp;filter&nbsp;=&nbsp;new&nbsp;RangeFilter(FieldNumber,&nbsp;NumberTools.LongToString(100L),&nbsp;NumberTools.LongToString(200L),&nbsp;true,&nbsp;true); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query,&nbsp;filter); <br />
<br />
使用&nbsp;Query&nbsp;作为过滤条件。 <br />
QueryFilter&nbsp;filter&nbsp;=&nbsp;new&nbsp;QueryFilter(QueryParser.Parse("name2",&nbsp;FieldValue,&nbsp;analyzer)); <br />
<br />
我们还可以使用&nbsp;FilteredQuery&nbsp;进行多条件过滤。 <br />
<br />
Filter&nbsp;filter&nbsp;=&nbsp;new&nbsp;DateFilter(FieldDate,&nbsp;DateTime.Parse("2005-10-10"),&nbsp;DateTime.Parse("2005-10-15")); <br />
Filter&nbsp;filter2&nbsp;=&nbsp;new&nbsp;RangeFilter(FieldNumber,&nbsp;NumberTools.LongToString(11L),&nbsp;NumberTools.LongToString(13L),&nbsp;true,&nbsp;true); <br />
<br />
Query&nbsp;query&nbsp;=&nbsp;QueryParser.Parse("name*",&nbsp;FieldName,&nbsp;analyzer); <br />
query&nbsp;=&nbsp;new&nbsp;FilteredQuery(query,&nbsp;filter); <br />
query&nbsp;=&nbsp;new&nbsp;FilteredQuery(query,&nbsp;filter2); <br />
<br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
</cc>7.&nbsp;分布搜索 <br />
<br />
我们可以使用&nbsp;MultiReader&nbsp;或&nbsp;MultiSearcher&nbsp;搜索多个索引库。 <br />
<br />
MultiReader&nbsp;reader&nbsp;=&nbsp;new&nbsp;MultiReader(new&nbsp;IndexReader[]&nbsp;{&nbsp;IndexReader.Open(@"c:\index"),&nbsp;IndexReader.Open(@"\\server\index")&nbsp;}); <br />
IndexSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
<br />
或 <br />
<br />
IndexSearcher&nbsp;searcher1&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader1); <br />
IndexSearcher&nbsp;searcher2&nbsp;=&nbsp;new&nbsp;IndexSearcher(reader2); <br />
MultiSearcher&nbsp;searcher&nbsp;=&nbsp;new&nbsp;MultiSearcher(new&nbsp;Searchable[]&nbsp;{&nbsp;searcher1,&nbsp;searcher2&nbsp;}); <br />
Hits&nbsp;hits&nbsp;=&nbsp;searcher.Search(query); <br />
<br />
还可以使用&nbsp;ParallelMultiSearcher&nbsp;进行多线程并行搜索。 <br />
<br />
8.&nbsp;合并索引库 <br />
<br />
将&nbsp;directory1&nbsp;合并到&nbsp;directory2&nbsp;中。 <br />
Directory&nbsp;directory1&nbsp;=&nbsp;FSDirectory.GetDirectory("index1",&nbsp;false); <br />
Directory&nbsp;directory2&nbsp;=&nbsp;FSDirectory.GetDirectory("index2",&nbsp;false); <br />
<br />
IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(directory2,&nbsp;analyzer,&nbsp;false); <br />
writer.AddIndexes(new&nbsp;Directory[]&nbsp;{&nbsp;directory&nbsp;}); <br />
Console.WriteLine(writer.DocCount()); <br />
writer.Close(); <br />
<br />
9.&nbsp;显示搜索语法字符串 <br />
<br />
我们组合了很多种搜索条件，或许想看看与其对等的搜索语法串是什么样的。 <br />
BooleanQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;BooleanQuery(); <br />
query.Add(query1,&nbsp;true,&nbsp;false); <br />
query.Add(query2,&nbsp;true,&nbsp;false); <br />
//... <br />
<br />
Console.WriteLine("Syntax:&nbsp;{0}",&nbsp;query.ToString()); <br />
<br />
输出： <br />
Syntax:&nbsp;+(name:name*&nbsp;value:name*)&nbsp;+number:[0000000000000000b&nbsp;TO&nbsp;0000000000000000d] <br />
<br />
呵呵，就这么简单。 <br />
<br />
10.&nbsp;操作索引库 <br />
<br />
删除&nbsp;(软删除，仅添加了删除标记。调用&nbsp;IndexWriter.Optimize()&nbsp;后真正删除。) <br />
IndexReader&nbsp;reader&nbsp;=&nbsp;IndexReader.Open(directory); <br />
<br />
//&nbsp;删除指定序号(DocId)的&nbsp;Document。 <br />
reader.Delete(123); <br />
<br />
//&nbsp;删除包含指定&nbsp;Term&nbsp;的&nbsp;Document。 <br />
reader.Delete(new&nbsp;Term(FieldValue,&nbsp;"Hello")); <br />
<br />
//&nbsp;恢复软删除。 <br />
reader.UndeleteAll(); <br />
<br />
reader.Close(); <br />
<br />
增量更新&nbsp;(只需将&nbsp;create&nbsp;参数设为&nbsp;false，即可往现有索引库添加新数据。) <br />
Directory&nbsp;directory&nbsp;=&nbsp;FSDirectory.GetDirectory("index",&nbsp;false); <br />
IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(directory,&nbsp;analyzer,&nbsp;false); <br />
writer.AddDocument(doc1); <br />
writer.AddDocument(doc2); <br />
writer.Optimize(); <br />
writer.Close(); <br />
<br />
11.&nbsp;优化 <br />
<br />
批量向&nbsp;FSDirectory&nbsp;增加索引时，增大合并因子(mergeFactor&nbsp;)和最小文档合并数(minMergeDocs)有助于提高性能，减少索引时间。 <br />
<br />
IndexWriter&nbsp;writer&nbsp;=&nbsp;new&nbsp;IndexWriter(directory,&nbsp;analyzer,&nbsp;true); <br />
<br />
writer.maxFieldLength&nbsp;=&nbsp;1000;&nbsp;//&nbsp;字段最大长度 <br />
writer.mergeFactor&nbsp;=&nbsp;1000; <br />
writer.minMergeDocs&nbsp;=&nbsp;1000; <br />
<br />
for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10000;&nbsp;i++) <br />
{ <br />
&nbsp;&nbsp;//&nbsp;Add&nbsp;Documentes... <br />
} <br />
<br />
writer.Optimize(); <br />
writer.Close(); <br />
<br />
相关参数说明&nbsp; <br />
<br />
<br />
转自《深入&nbsp;Lucene&nbsp;索引机制》 <br />
<br />
利用&nbsp;Lucene，在创建索引的工程中你可以充分利用机器的硬件资源来提高索引的效率。当你需要索引大量的文件时，你会注意到索引过程的瓶颈是在往磁盘上写索引文件的过程中。为了解决这个问题,&nbsp;Lucene&nbsp;在内存中持有一块缓冲区。但我们如何控制&nbsp;Lucene&nbsp;的缓冲区呢？幸运的是，Lucene&nbsp;的类&nbsp;IndexWriter&nbsp;提供了三个参数用来调整缓冲区的大小以及往磁盘上写索引文件的频率。 <br />
<br />
1．合并因子&nbsp;(mergeFactor) <br />
<br />
这个参数决定了在&nbsp;Lucene&nbsp;的一个索引块中可以存放多少文档以及把磁盘上的索引块合并成一个大的索引块的频率。比如，如果合并因子的值是&nbsp;10，那么当内存中的文档数达到&nbsp;10&nbsp;的时候所有的文档都必须写到磁盘上的一个新的索引块中。并且，如果磁盘上的索引块的隔数达到&nbsp;10&nbsp;的话，这&nbsp;10&nbsp;个索引块会被合并成一个新的索引块。这个参数的默认值是&nbsp;10，如果需要索引的文档数非常多的话这个值将是非常不合适的。对批处理的索引来讲，为这个参数赋一个比较大的值会得到比较好的索引效果。 <br />
<br />
2．最小合并文档数&nbsp;(minMergeDocs) <br />
<br />
这个参数也会影响索引的性能。它决定了内存中的文档数至少达到多少才能将它们写回磁盘。这个参数的默认值是10，如果你有足够的内存，那么将这个值尽量设的比较大一些将会显著的提高索引性能。 <br />
<br />
3．最大合并文档数&nbsp;(maxMergeDocs) <br />
<br />
这个参数决定了一个索引块中的最大的文档数。它的默认值是&nbsp;Integer.MAX_VALUE，将这个参数设置为比较大的值可以提高索引效率和检索速度，由于该参数的默认值是整型的最大值，所以我们一般不需要改动这个参数。 <br />
</cc>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1208227.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41310/" target="_blank">[新闻]AOL将关闭3个网站以降低成本 集中发力广告</a>]]></description></item><item><title>利用Lucene.net搜索引擎进行多条件搜索的做法 </title><link>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207816.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Mon, 26 May 2008 09:08:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207816.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1207816.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1207816.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1207816.html</trackback:ping><description><![CDATA[1 联合两个索引查询，已解决： <br />
IndexSearcher[] searchers = new IndexSearcher[2];&nbsp; <br />
&nbsp;&nbsp; <br />
searchers[0] = new IndexSearcher(m_indexpath); <br />
searchers[1] = new IndexSearcher(m_outindexpath); <br />
<br />
MultiSearcher multiSearcher = new MultiSearcher(searchers); <br />
<br />
<span style="color: #ff0000">2，还有个进行多条件搜索 and 与 or 的操作———— <br />
<font color="#000000">用 MultiFieldQueryParser <br />
建议重新封装 <br />
MultiFieldQueryParser.Parser(p[],d[],f[],analyer)&nbsp;&nbsp;成or 与 and操作合一 <br />
</font>或者&nbsp;<br />
<font color="#000000"><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BooleanQuery thisQuery = new BooleanQuery();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisQuery.Add(query1,true,false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisQuery.Add(query2, false, false);<br />
</font><br />
</font></span>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1207816.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41309/" target="_blank">[新闻]谷歌网页索引数量突破1万亿个</a>]]></description></item><item><title>蜘蛛中可以用到的正则收集 </title><link>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207815.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Mon, 26 May 2008 09:07:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207815.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1207815.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/05/26/1207815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1207815.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1207815.html</trackback:ping><description><![CDATA[1，得到网页上的链接地址：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span red; BACKGROUND-COLOR: #808080?>string matchString = @"&lt;a[^&gt;]+href=\s*(?:'(?&lt;href&gt;[^']+)'|""(?&lt;href&gt;[^""]+)""|(?&lt;href&gt;[^&gt;\s]+))\s*[^&gt;]*&gt;";<br />
</span>2，得到网页的标题：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span red; BACKGROUND-COLOR: #808080?>string matchString = @"&lt;title&gt;(?&lt;title&gt;.*)&lt;/title&gt;";<br />
</span>3，去掉网页中的所有的html标记：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span red; BACKGROUND-COLOR: #808080?>string temp = Regex.Replace(html, "&lt;[^&gt;]*&gt;", "");</span>&nbsp;&nbsp; //html是一个要去除html标记的文档 <br />
4, string matchString = @"&lt;title&gt;([\S\s\t]*?)&lt;/title&gt;"; 
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1207815.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41309/" target="_blank">[新闻]谷歌网页索引数量突破1万亿个</a>]]></description></item><item><title>Nutch Vs. Lucene</title><link>http://www.cnblogs.com/xinzhyu/archive/2008/05/25/1206954.html</link><dc:creator>隨風.NET</dc:creator><author>隨風.NET</author><pubDate>Sun, 25 May 2008 09:14:00 GMT</pubDate><guid>http://www.cnblogs.com/xinzhyu/archive/2008/05/25/1206954.html</guid><wfw:comment>http://www.cnblogs.com/xinzhyu/comments/1206954.html</wfw:comment><comments>http://www.cnblogs.com/xinzhyu/archive/2008/05/25/1206954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xinzhyu/comments/commentRss/1206954.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xinzhyu/services/trackbacks/1206954.html</trackback:ping><description><![CDATA[Nutch 是基于 Lucene的。Lucene为 Nutch 提供了文本索引和搜索的API。一个常见的问题是；我应该使用Lucene还是Nutch？最简单的回答是：如果你不需要抓取数据的话，应该使用Lucene。常见的应用场合是：你有数据源，需要为这些数据提供一个搜索页面。在这种情况下，最好的方式是直接从数据库中取出数据并用Lucene API建立索引。Nutch 适用于你无法直接获取数据库中的网站，或者比较分散的数据源的情况下使用。<br />
<br />
<p><span><font face="Times New Roman">DotLucene</font></span><span>的发展历史</span></p>
<p><span><font face="Times New Roman">Lucene-</font></span><span>〉</span><span><font face="Times New Roman">NLucene-</font></span><span>〉</span><span><font face="Times New Roman">Lucene.Net-</font></span><span>〉</span><span><font face="Times New Roman">DotLucene</font></span>&nbsp;</p>
<p><strong><span><font face="Times New Roman">Lucene </font></span></strong><font size="2"><span>是一个基于</span><span><font face="Times New Roman"> Java </font></span><span>的全文索引工具包，</span><span><font face="Times New Roman">Lucene</font></span><span>的贡献者</span><span><font face="Times New Roman"> Doug Cutting </font></span><span>是一位资深全文索引</span><span><font face="Times New Roman">/</font></span><span>检索专家，曾经是</span><span><font face="Times New Roman"> V-Twin </font></span><span>搜索引擎</span><span><font face="Times New Roman">(Apple </font></span><span>的</span><span><font face="Times New Roman"> Copland </font></span><span>操作系统的成就之一</span><span><font face="Times New Roman">)</font></span><span>的主要开发者，后在</span><span><font face="Times New Roman"> Excite </font></span><span>担任高级系统架构设计师，目前从事于一些</span><span><font face="Times New Roman"> Internet </font></span><span>底层架构的研究。他贡献出的</span><span><font face="Times New Roman"> Lucene </font></span><span>的目标是为各种中小型应用程序加入全文检索功能。</span></font></p>
<p><font size="2"><span><font face="Times New Roman">Lucene </font></span><span>早先发布在作者自己的</span><span><font face="Times New Roman"> <a href="http://www.lucene.com/" target="_blank">http://www.lucene.com/</a></font></span><span>，后来发布在</span><span><font face="Times New Roman"> SourceForge</font></span><span>，</span><span><font face="Times New Roman">2001</font></span><span>年年底成为</span><span><font face="Times New Roman"> APACHE </font></span><span>基金会</span><span><font face="Times New Roman"> Jakarta </font></span><span>的一个子项目。</span></font></p>
<p><font size="2"><span>已经有很多</span><span><font face="Times New Roman">Java</font></span><span>项目都使用了</span><span><font face="Times New Roman">Lucene</font></span><span>作为其后台的全文索引引擎，比较著名的有：</span>&nbsp;</font></p>
<p><font size="2"><span><font face="Times New Roman">Jive</font></span><span>：</span><span><font face="Times New Roman">WEB</font></span><span>论坛系统；</span></font></p>
<p><font size="2"><span><font face="Times New Roman">Eyebrows</font></span><span>：邮件列表</span><span><font face="Times New Roman"> HTML </font></span><span>归档</span><span><font face="Times New Roman">/</font></span><span>浏览</span><span><font face="Times New Roman">/</font></span><span>查询系统，本文的主要参考文档&#8220;</span><span><font face="Times New Roman">TheLucene search engine: Powerful, flexible, and free</font></span><span>&#8221;作者就是</span><span><font face="Times New Roman"> EyeBrows </font></span><span>系统的主要开发者之一，而</span><span><font face="Times New Roman"> EyeBrows </font></span><span>已经成为目前</span><span><font face="Times New Roman"> APACHE </font></span><span>项目的主要邮件列表归档系统；</span><span><font face="Times New Roman"></font></span></font></p>
<p><font size="2"><span><font face="Times New Roman">Cocoon</font></span><span>：基于</span><span><font face="Times New Roman"> XML </font></span><span>的</span><span><font face="Times New Roman"> Web </font></span><span>发布框架，全文检索部分使用了</span><span><font face="Times New Roman">Lucene</font></span><span>；</span></font></p>
<p><font size="2"><span><font face="Times New Roman">Eclipse</font></span><span>：基于</span><span><font face="Times New Roman"> Java </font></span><span>的开放开发平台，帮助部分的全文索引使用了</span><span><font face="Times New Roman"> Lucene</font></span><span>。</span></font></p>
<p><font size="2"><span>以上信息来自</span><span><a href="http://www.chedong.com/tech/lucene.html"><font face="Times New Roman"><a href="http://www.chedong.com/tech/lucene.html" target="_blank">http://www.chedong.com/tech/lucene.html</a></font></a></span></font></p>
<font size="2"><span>Lucene </span><span>本身不支持中文的索引，但它良好的架构设计，使得只需根据语言词法分析接口，增加一个中文解析器即可实现中文的索引。这一工作是由车东（</span><span><a href="http://www.chedong.com/" target="_blank">http://www.chedong.com/</a></span><span>）完成的：</span><span>WebLucene </span><span>中提供了</span><span> CJKTokenizer</span><span>，可以分析东亚文字</span></font><br />
<br />
<div>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-size: 12pt"><font face="Times New Roman">NLucene</font></span></strong><font size="2"><span style="font-family: 宋体">是将</span><font face="Times New Roman"> Lucene </font><span style="font-family: 宋体">从</span><font face="Times New Roman"> Java </font><span style="font-family: 宋体">移植到</span><font face="Times New Roman"> .NET </font><span style="font-family: 宋体">的一个</span><font face="Times New Roman"> SourceForge </font><span style="font-family: 宋体">项目，它从</span><font face="Times New Roman"> Lucene 1.2 </font><span style="font-family: 宋体">版本转化而来。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-size: 12pt"><font face="Times New Roman">Lucene.Net</font></span></strong><font size="2"><span style="font-family: 宋体">因为</span><font face="Times New Roman"> NLucene </font><span style="font-family: 宋体">项目到</span><font face="Times New Roman">2002</font><span style="font-family: 宋体">年就没有再推出新的版本，可</span><font face="Times New Roman">Lucene </font><span style="font-family: 宋体">却一直在发展，于是有人把</span><font face="Times New Roman">Lucene 1.3</font><span style="font-family: 宋体">版移植到</span><font face="Times New Roman">.NET</font><span style="font-family: 宋体">就成了</span><font face="Times New Roman">Lucene .NET</font><span style="font-family: 宋体">。但是</span><font face="Times New Roman">Lucene .Net</font><span style="font-family: 宋体">发展到</span><font face="Times New Roman">2.0</font><span style="font-family: 宋体">版的时候变成了商业化的产品，脱离了开源项目。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-size: 12pt"><font face="Times New Roman">DotLucene</font></span></strong><font size="2"><span style="font-family: 宋体">受到</span><font face="Times New Roman">Lucene.Net</font><span style="font-family: 宋体">脱离开源项目的影响，有人为了继续发展开源</span><font face="Times New Roman">.Net</font><span style="font-family: 宋体">搜索引擎，于是在</span><font face="Times New Roman">Lucene.Net</font><span style="font-family: 宋体">的原有基础上继续发展该项目，但是名字改成了</span><font face="Times New Roman">DotLucene</font><span style="font-family: 宋体">以区别于</span><font face="Times New Roman">Lucene.Net</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">目前基于</span><font face="Times New Roman">Lucene.Net/DotLucene</font><span style="font-family: 宋体">的项目有：</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Lookout - Outlook</font><span style="font-family: 宋体">插件，可以搜索邮件，联系人，计划任务，会议和文件夹。该公司已经被微软收购</span><font face="Times New Roman">[</font><span style="font-family: 宋体">免费</span><font face="Times New Roman">]</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">.Text - </font><span style="font-family: 宋体">著名的博客引擎</span><font face="Times New Roman">[</font><span style="font-family: 宋体">开源</span><font face="Times New Roman">]</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Beagle &#8211; Mono</font><span style="font-family: 宋体">基于</span><font face="Times New Roman">DotLucene</font><span style="font-family: 宋体">开发的桌面搜索引擎</span><font face="Times New Roman">[</font><span style="font-family: 宋体">开源</span><font face="Times New Roman">]</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Ascirum - Windows SharePoint Services</font><span style="font-family: 宋体">文档库的搜索解决方案</span><font face="Times New Roman"> [</font><span style="font-family: 宋体">商业</span><font face="Times New Roman">]</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Cuyahoga - .NET </font><span style="font-family: 宋体">网站架构</span><font face="Times New Roman">[</font><span style="font-family: 宋体">开源</span><font face="Times New Roman">]</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Tustena CRM - </font><span style="font-family: 宋体">客户关系管理服务器</span><font face="Times New Roman"> [</font><span style="font-family: 宋体">开源</span><font face="Times New Roman">]</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">Pali Text Reader - Pali </font><span style="font-family: 宋体">文本阅读程序软件是读取和为经典佛教</span><font face="Times New Roman">pali </font><span style="font-family: 宋体">文本的学习工具</span><font face="Times New Roman">[</font><span style="font-family: 宋体">开源</span><font face="Times New Roman">]</font><span style="font-family: 宋体">。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">SlopeTalk - </font><span style="font-family: 宋体">一个</span><span style="font-family: 宋体">布鲁克林</span><font face="Times New Roman"> (</font><span style="font-family: 宋体">美国纽约市西南部的一区</span><font face="Times New Roman">)</font><span style="font-family: 宋体">斜坡公园的路线向导。</span></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><font face="Times New Roman">DotLucene</font><span style="font-family: 宋体">官方网站：</span><font face="Times New Roman">http://www.dotlucene.net<br />
<br />
</p>
<p>这几天看demo完成了一个简单的索引+搜索。网上大多数是dotLucene.net 的例子，而Lucene.Net 2.0 的很少，其实连 <a href="http://www.dotlucene.net/" target="_blank">http://www.dotlucene.net/</a> 都关掉了，由于刚刚接触Lucene.net ，网上很多人说 Lucene.Net 从 2.0 开始就开始收费，其实，现在Lucene.net 又开始免费了。Lucene.net 现在成为apache 的开源项目 <a href="http://incubator.apache.org/projects/lucene.net.html" target="_blank">http://incubator.apache.org/projects/lucene.net.html</a> 。我想也正因此，dotLucene.net 才关闭的吧。回想起这几天研究Lucene.net 很是奇怪，刚开始的2天，还在 dotlucene.net 上面找资料，可是这个星期一一看，竟然出现关闭页面。开始很紧张，以为唯一一个 .net 的开源Lucene也没了。后来一看作者的介绍才发现竟然在apache.org 有一个开源的项目。而且按照项目介绍，Lucene.net 是完全按照java版来翻译的，连索引文件都可以通用。这也坚定了我研究最新版的Lucene.net 的决心。</p>
<p>In addition to the APIs and classes port to C#, the algorithm of Java Lucene is ported to C# Lucene. This means an index created with Java Lucene is back-and-forth compatible with the C# Lucene; both at reading, writing and updating. In fact a Lucene index can be concurrently searched and updated using Java Lucene and C# Lucene processes.</p>
</font></font></div>
<img src ="http://www.cnblogs.com/xinzhyu/aggbug/1206954.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41308/" target="_blank">[新闻]预装 Ubuntu 8.04 的 Dell 笔记本发售</a>]]></description></item></channel></rss>