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

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

    今天很残酷,明天很残酷,后天很美好...行胜于言<来源于博客园:黄岛主>.... 个站:配置啦
  • 相关阅读:
    Help-Web应用-.Net-Razor界面-入门-添加模型:在 ASP.NET Core 中向 Razor Pages 应用添加模型
    Help-Web应用-.Net-Razor界面-入门-教程:开始使用ASP.NET Core中的Razor Pages
    Help-Web应用-.Net-Razor界面-概述-教程:使用 ASP.NET Core 创建 Razor 页面 Web 应用
    白菜:奶白菜
    白菜:油白菜
    shell中&&和||的使用方法
    ISCSI测试
    iscsi共享分区测试
    RHEL7-openldap安装配置三(客户端自动挂载配置)
    redis配置笔记
  • 原文地址:https://www.cnblogs.com/taohuadaozhu/p/2730313.html
Copyright © 2020-2023  润新知