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构造函数,按步就班构造索引即可:

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

 

4、简单搜索

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  static  string  GetKeyWordsSplitBySpace( string  keywords, PanGuTokenizer ktTokenizer)
{
     StringBuilder result = new  StringBuilder();
     ICollection<WordInfo> words = ktTokenizer.SegmentToWordInfos(keywords);
     foreach  (WordInfo word in  words)
     {
         if  (word == null )
         {
             continue ;
         }
         result.AppendFormat( "{0}^{1}.0 " , word.Word, ( int )Math.Pow(3, word.Rank));
     }
     return  result.ToString().Trim();
}

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

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





本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2011/01/02/lucene-net-PanGuAnalyzer.html,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值