使用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";
            }

        }
    }
}


posted @ 2011-06-04 16:33  lxk613  阅读(661)  评论(0编辑  收藏  举报