欢迎访问个人博客站点: 配置啦
随笔 - 109  文章 - 2  评论 - 20  阅读 - 55755

关于近期对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词典的简单维护与测试等等.

 

好了,明天还要上班,今天就先到这里,待完善了以后,到时发些代码上来。

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
< 2012年10月 >
30 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3
4 5 6 7 8 9 10

点击右上角即可分享
微信分享提示