使用Lucene.NET进行分词、搜索
Lucene.NET是一个开源的项目,能够对中文或者英文等各种字符进行分析检索,是一款比较强大的分词搜索工具。它是一个库的形式,因此,需要在自己的工程中引用。今天分析了一下这个源代码,参考了 http://kwklover.cnblogs.com/archive/2006/06/25/435421.html 的博客,他使用的Lucene的版本是2.1的,我下载的这个是2.9的,里面的很多API都已经不适用了,因此需要做适当的修改。以下是创建的详细步骤。
1.打开vs2010,新建一个工程,这里我创建一个win Form工程。创建好之后需要在reference中添加对这个工程的引用:Lucene.Net.dll。(因为我是下载了LUcene.NET的源代码,然后打开它所有的源代码分析的,打开它的工程后我才创建的一个Win Form界面程序,其实效果一样,只是这样我能够看到它的源代码,更直观方便而已)。
2.添加一个Buttom,两个RichTextBox,用于进行开始和显示结果的。
3.当然是添加处理代码了,双击开始按钮,添加代码如下。
运行的效果图如下:
using System; using System.Windows.Forms; using Lucene.Net.Analysis.Standard; using Lucene.Net.Analysis; using System.IO; using System.Collections; //http://kwklover.cnblogs.com/archive/2006/06/25/435421.html //这个是我参考的博客,也是园子的,哈哈 namespace 分词操作 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Hashtable hashtable = new Hashtable();//用于统计分词结果的 richTextBox1.Text = ""; richTextBox2.Text = ""; //Lucene.Net.Util.Version ver =new Lucene.Net.Util.Version("LUCENE_29",2900); string temp = textBox1.Text; StandardAnalyzer analyzer = new StandardAnalyzer(); StringReader sr = new StringReader(temp); TokenStream ts = analyzer.TokenStream(String.Empty, sr); Token token = null; int i = 1; while ((token = ts.Next()) != null) { int index = token.ToString().IndexOf(",", 1);// /************************************************************************/ /* token的形式如图 (hello,0,5,type=<ALPHANUM>) (test,13,17,type=<ALPHANUM>) 这个alphanumeric代表字母数字了 * (毛,20,21,type=<CJ>) (主,21,22,type=<CJ>) CJ代表chinese japanese */ /************************************************************************/ string tempstr = token.ToString().Substring(1, index-1 ); if (!hashtable.ContainsKey(tempstr)) { hashtable.Add(tempstr,1); } else {
int count = Convert.ToInt32(hashtable[tempstr].ToString()); hashtable.Remove(tempstr); hashtable.Add(tempstr, count+1); } richTextBox1.Text += token.ToString()+"\n"; } foreach (var key in hashtable.Keys) { richTextBox2.Text +=key+" 出现的次数:" +hashtable[key].ToString()+"\n";//hashtable[key].ToString().Replace("(","").Replace(")","")+"\n"; } } } }