• Lucene.Net:使用eaglet的盘古分词进行分词和搜索(转载)


    本文主要简单介绍如何使用eaglet的盘古分词在lucene.net中进行创建索引和简单搜索。盘古分词是eaglet大大的杰作,如果您还没有尝试使用过,希望本文的介绍会对您有所帮助。

    1、盘古分词参考资料汇总

    http://www.cnblogs.com/eaglet/tag/%e5%88%86%e8%af%8d/

    http://pangusegment.codeplex.com/

    http://hubbledotnet.51aspx.com/

    http://home.cnblogs.com/group/topic/31349-6.html

    牛人的贡献不仅仅是无私提供几个工具,几个类库,几个开源项目,还有他们的博学,对知识理解的深度,以及谦虚低调的态度。大牛的人格魅力往往都是很吸引人的。向eaglet致敬。

    2、使用盘古分词器(PanGuAnalyzer)准备工作

    (1)、PanGu.xml文件

    这个文件主要保存盘古分词的常用配置,其中DictionaryPath 指明字典所在目录,可以为相对路径也可以为绝对路径;MatchOptions 对应分词选项;Parameters 对于分词参数。本文示例demo中,我选择的是默认配置。同时在该xml文件的属性上,把它的生成操作设置成“嵌入的资源”。

    (2)、如你所知,分词词库的维护也是盘古分词的一大重要工作。本文QueryApp控制台应用程序的bin目录下的Dictionaries是从codeplex上下载下来的(默认放在应用程序bin目录下)。这和(1)中的PanGu.xml的DictionaryPath 配置节点有关。

    (3)、应用程序中(本文即QueryApp控制台应用程序)必须同时引用Lucene.Net.dll,PanGu.dll和PanGu.Lucene.Analyzer.dll。

    3、创建索引

    Lucene.Net的IndexWriter在实例化的时候,需要一个Analyzer实例,使用盘古分词进行索引创建很简单,只要将PanGuAnalyzer实例传入IndexWriter构造函数,按步就班构造索引即可:

    01public static void PrepareIndex(bool isPangu)
    02{
    03    Analyzer analyzer = null;
    04    if (isPangu)
    05    {
    06        analyzer = new PanGuAnalyzer();//盘古Analyzer
    07    }
    08    else
    09    {
    10        analyzer = new StandardAnalyzer(Version.LUCENE_29);
    11    }
    12    DirectoryInfo dirInfo = Directory.CreateDirectory(Config.INDEX_STORE_PATH);
    13    LuceneIO.Directory directory = LuceneIO.FSDirectory.Open(dirInfo);
    14    IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
    15    CreateIndex(writer, "jeffreyzhao", "博客园有一个老赵,人格魅力巨大,洋名就叫jeffreyzhao。据我所知,他还是一个胖子,一个钢琴业余爱好者。");
    16    CreateIndex(writer, "lucene测试", "这是一个测试,关于lucene.net的 关注老赵");
    17    CreateIndex(writer, "博客园里有牛人", "Hello World. 我认识的一个高手,他拥有广博的知识,有极客的态度,还经常到园子里来看看");
    18    CreateIndex(writer, "奥巴马", "美国现任总统是奥巴马?确定不是奥巴牛和奥巴羊 不知道问老赵");
    19    CreateIndex(writer, "奥林匹克", "奥林匹克运动会将来到南美美丽热情的国度巴西,也就是亚马逊河流域的一个地方");
    20    CreateIndex(writer, "写给自己", "博客园的jeffwong,新的开始,继续努力了");
    21    writer.Optimize();
    22    writer.Close();
    23}

    4、简单搜索

    搜索同样也比较容易上手,只要将QueryParser中的Analyzer参数使用PanGuAnalyzer实例就可以了:

    1public static void PanguQueryTest(Analyzer analyzer, string field, string keyword)
    2{
    3    QueryParser parser = new QueryParser(Version.LUCENE_29, field, analyzer);
    4    string panguQueryword = GetKeyWordsSplitBySpace(keyword, new PanGuTokenizer());//对关键字进行分词处理
    5    Query query = parser.Parse(panguQueryword);
    6    ShowQueryExpression(analyzer, query, keyword);
    7    SearchToShow(query);
    8    Console.WriteLine();
    9}

    其中对关键字进行盘古分词处理的函数GetKeyWordsSplitBySpace直接来源于eaglet提供的示例代码:

    01public static string GetKeyWordsSplitBySpace(string keywords, PanGuTokenizer ktTokenizer)
    02{
    03    StringBuilder result = new StringBuilder();
    04    ICollection<WordInfo> words = ktTokenizer.SegmentToWordInfos(keywords);
    05    foreach (WordInfo word in words)
    06    {
    07        if (word == null)
    08        {
    09            continue;
    10        }
    11        result.AppendFormat("{0}^{1}.0 ", word.Word, (int)Math.Pow(3, word.Rank));
    12    }
    13    return result.ToString().Trim();
    14}

    PanGuTokenizer的SegmentToWordInfos这个方法,我正在查看源码实现,希望可以理解的更透彻一点。

    最后,本文面向的对象是初学者,如果您有好的使用经验和建议敬请不吝赐教。

    demo下载:LuceneNetApp

  • 相关阅读:
    Android JNI用于驱动測试
    shell实例浅谈之三产生随机数七种方法
    WEB安全实战(二)带你认识 XSS 攻击
    前端和云端性能分析工具分析报告
    【翻译】Ext JS——高效的编码风格指南
    dubbo协议
    JavaBean对象转map
    messagePack编解码
    主流编码框架
    java编解码技术,json序列化与二进制序列化
  • 原文地址:https://www.cnblogs.com/chenying99/p/1971386.html
Copyright © 2020-2023  润新知