lucene.net3.0.3使用例子

发布日期:2013-03-29 16:42:37
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


using System.IO;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Lucene.Net.Util;


namespace Lucene3Test
{


    class Program
    {
        static void Main(string[] args)
        {
            Token();
            CreateIndex();
            Search();
            Console.WriteLine(Lucene.Net.Util.Version.LUCENE_30);
            Console.ReadKey();
        }


        // 分词
        static void Token()
        {
            Console.WriteLine("测试分词");
            Lucene.Net.Analysis.Standard.StandardAnalyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
            string str = "my name is julian.zhu,欢迎访问我的个人网站www.zhuzhusoft.com";
            System.IO.StringReader reader = new System.IO.StringReader(str);
            Lucene.Net.Analysis.TokenStream ts = analyzer.TokenStream(str, reader);
            bool hasNext = ts.IncrementToken();
            Lucene.Net.Analysis.Tokenattributes.ITermAttribute ita;
            while (hasNext)
            {
                ita = ts.GetAttribute<Lucene.Net.Analysis.Tokenattributes.ITermAttribute>();
                Console.Write(ita.Term + "|");
                hasNext = ts.IncrementToken();
            }
            Console.WriteLine();
            ts.CloneAttributes();
            reader.Close();
            analyzer.Close();
        }


        // 创建索引
        static void CreateIndex()
        {
            Console.WriteLine("测试创建索引");
            Analyzer analyzer = null;
            analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
            DirectoryInfo dirInfo = Directory.CreateDirectory("LuceneIndex");
            Lucene.Net.Store.Directory directory = Lucene.Net.Store.FSDirectory.Open(dirInfo);
            IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
            CreateIndex(writer, "小周", "21", "网管");
            CreateIndex(writer, "小朱", "29", "程序员");
            CreateIndex(writer, "小王", "20", "网页设计师");
            CreateIndex(writer, "小沈", "24", "平面设计师");
            CreateIndex(writer, "小范", "25", "程序员");
            writer.Optimize();
            writer.Dispose();
        }


        static void CreateIndex(IndexWriter writer, string title, string age, string content)
        {
            try
            {
                Document doc = new Document();
                doc.Add(new Field("name", title, Field.Store.YES, Field.Index.ANALYZED));
                doc.Add(new Field("age", age, Field.Store.YES, Field.Index.NO));
                doc.Add(new Field("job", content, Field.Store.YES, Field.Index.ANALYZED));
                doc.Add(new Field("createdate", DateTime.Now.AddMonths(-1).ToString("yyyyMMdd"), Field.Store.YES, Field.Index.ANALYZED));//存储且索引
                writer.AddDocument(doc);
            }
            catch (FileNotFoundException fnfe)
            {
                throw fnfe;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        // 搜索
        static void Search()
        {
            Console.WriteLine("测试搜索");
            string keyword = "设计";
            string field = "job";
            Analyzer analyzer = null;
            analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
            QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, field, analyzer);
            Query query = parser.Parse(keyword);


            int n = 1000;
            DirectoryInfo dirInfo = Directory.CreateDirectory("LuceneIndex");
            Lucene.Net.Store.Directory directory = Lucene.Net.Store.FSDirectory.Open(dirInfo);
            IndexSearcher searcher = new IndexSearcher(directory, true);
            TopDocs docs = searcher.Search(query, (Filter)null, n);
          
            if (docs == null || docs.TotalHits == 0)
            {
                Console.WriteLine("没有结果!");
            }
            else
            {
                int counter = 1;
                foreach (ScoreDoc sd in docs.ScoreDocs)
                {
                    try
                    {
                        Document doc = searcher.Doc(sd.Doc);
                        string name = doc.Get("name");
                        string age = doc.Get("age");
                        string job = doc.Get("job");
                        string createdate = doc.Get("createdate");
                        string result = string.Format("这是第{0}个搜索结果,name为{1},age{2},createdate:{3},job:{4}", counter, name, age, createdate, job);
                        Console.WriteLine(result);
                    }
                    catch (Exception ex)
                    {


                    }
                    counter++;
                }
            }


        }




    }


}