关于近期对Lucene.Net应用研究学习的总结
这是一个研究性的解决方案,下面对其中的项目做下简单的介绍:
1>Lucene.Net.Analysis.SharpICTCLASAnalyzer//来自博客园
2>Lucene.Net.Analysis.SimpleSplitAnalyzer//来自博客园,如果作者发现了是他的,可以联系我.
这两个项目,如果你有接触过的话,看到项目名称就知道这两个都是Lucene.Net.Analysis.Analyzer的派生类了.和Lucene自带的分析器只是具体的实现不一样,如果有童鞋问Analyzer是干啥的,那我只能建议从度娘上百度一下Lucene了..
不过有些刚接触的童鞋可能对SimpleSplitAnalyzer有些疑问,这个分析器有时很有用,因为
我们在分词的时候,为了提高分词速度,针对不同的数据,会选择不同的分词器,有些特殊的数据,可能本来就是我们自己设置的规则,比如用分号隔开,用Split处理后的每一项都是一项有意义的数据,再分反而没有意义了.这时候,咱们这个简单高效的分析器就派上大用场了。
3>PreProcessUtility项目,来自吕震宇老师的SharpICTCLAS1.0,可以根据应用从场景进行一些预处理,比如繁体子处理,去HTML之类的..
4>SharpICTCLAS项目,是吕震宇老师幸苦的结晶,这里再次感谢他..当然我们也不能忘了原作者,中科院的张华平博士了
5>Lucene.Net.ApplyBase项目,我设计它作为搜索方案处理的基类,为啥呢,因为刚开始,我一股脑的写在一起,虽然是个研究或学习性的项目,但后来发现,如果要实现百度首页新闻,网页,贴吧,知道,文库……这种多类型多来源的搜索就顿时傻了。于是乎,干脆把我在Test项目中需要的索引创建,维护,搜索等一般性的流程封装到一系列的基类中.之后遇到新闻,网页,贴吧之类的异构数据,只需要分别实现了。
这个项目比较关键,先看一下图::
5.1>Token.下的PerFieldAnalyzerWrapperConfigBase主要是用来处理一个搜索方案中,不同Field上的不同分词处理. 毕竟很多时候,既然可以优化一下,当然去优化了。否则图个方便省事,性能就如蜗牛了.
TokenTools显然用于分词了,这里通过调用前辈们研究出来的分词器,轻易的完成分词工作。我们知道我们的搜索即可以调用或者组合针对性的query派生类,也可以去构建类似于数据库中t-sql查询语句去搜索,让lucene去分析并处理. 而TokenTools在期间起着首当其冲的辅助作用。没有它,我试验中,搜索经常搜不到预期的内容。
5.2>Searchers空间下的SearcherBase,主要提供常用的搜索方法,尤其其中有几个搜索结果转化的抽象方法,比如:
protected abstract void SaveSearchResult(Hits resultHits);
protected abstract void SaveSearchResult(ScoreDoc[] docs, IndexSearcher indexSearch, bool CloseSearchBeforeReturn);
protected abstract void SaveSearchResult(TopDocs topDocs);
有了结果转化的方案,再看一下最简单的Term搜索
public virtual void SearchByTerm(string indexDir, string word, string queryFieldName) {
IndexSearcher indexSearcher = new IndexSearcher(indexDir);
Term t = new Term(queryFieldName, word);
Query query = new TermQuery(t);
Hits resultHits = indexSearcher.Search(query);
SaveSearchResult(resultHits);//这里就把搜索结果给保存下来了,至于如何处理,那就不是这里该讨论的问题了。
CloseIndexSearch(indexSearcher);
}
5.3Indexer空间下IndexerEngine我设计它来完成创建,覆盖索引这些基础性的工作
IndexerManagerBase则是一个抽象类,考虑到我们的索引创建完了,随着服务的运营,数据不断地产生,索引当然也要不断的维护,更新了。比如增加,修改,删除,目前我参考了很多网友的资料,修改其实就是先删除再增加。
5.4ExcuteReport空间下的ExcuteReportStruct是我用来作为执行进度的状态报告对象,因为测试项目是个桌面程序,索引创建,管理这些有时在子线程完成的,为了在UI中看到进度就设计了这个东东了,之前因为看不到进度,连撞墙的心都有了^^。
ReportManagerBase是辅助给Report对象赋值的基类,因为待我们去索引的数据可能是某个文件夹下的一堆文件,也有可能来自数据库,还有网页这些。我们需要知道进度中的总的Document数目。
5.5Documenter下DocumentManagerBase是索引创建过程中的文档过程的封装,这个应该很好处理,只要搞清了每个Field在应用中的具体定位就差不多了,当然我们也不要忘记了文档的评分处理了,不然以后的搜索结果呈现出来,咱们感觉和没有搜索那不一样吗,哈哈。
5.6Booster. BoosterBase这块当然是对Field评分的处理基类.
6>Lucene.Net.PMLucene,这个没什么说的,其实就是派生于Lucene.Net.ApplyBase,是一种具体的应用实现
7>Test项目当然是测试项目了,这里简单实现了索引的创建,管理维护,搜索,SharpICTCLAS词典的简单维护与测试等等.
好了,明天还要上班,今天就先到这里,待完善了以后,到时发些代码上来。