Lucene.net3.0.3 索引、增量索引、查询等基本操作

发布日期:2012-10-31 12:59:38

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

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

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            String indexDir = Server.MapPath("~/LuceneIndex");
            Analyzer analyzer = null;

           
            analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);
           
            DirectoryInfo dirInfo = null;
           
            if (Directory.Exists(indexDir))
            {
                dirInfo = new DirectoryInfo(indexDir);
            }
            else
            {
                dirInfo = Directory.CreateDirectory(indexDir);
            }
           
            //dirInfo = Directory.CreateDirectory(indexDir);
            Lucene.Net.Store.Directory directory = Lucene.Net.Store.FSDirectory.Open(dirInfo);

            IndexWriter writer = null;
           
            if (Directory.Exists(indexDir))
            {
                // 增量索引
                writer = new IndexWriter(directory, analyzer, false, IndexWriter.MaxFieldLength.LIMITED);
            }
            else
            {
                // 创建索引
                writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
            }
           
            //writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);

            Response.Write(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "<BR>");
            for (int i = 0; i < 10; i++)
            {
                CreateIndex(writer, "小周", "21", "网管", "20101201153611");
                CreateIndex(writer, "小朱", "29", "程序员", "20111105153611");
                CreateIndex(writer, "小王", "20", "网页设计师", "20091201153611");
                CreateIndex(writer, "小沈", "24", "平面设计师", "20110607153611");
                CreateIndex(writer, "小范", "25", "程序员", "20110101153611");
                CreateIndex(writer, "小周", "25", "销售", "20121201153611");
                CreateIndex(writer, "小李", "26", "销售", "20101201153611");
            }


            writer.Optimize();
            writer.Close();

            // 删除索引
            writer = new IndexWriter(directory, analyzer, false, IndexWriter.MaxFieldLength.LIMITED);
            writer.DeleteDocuments(new Term("name", "周"));
            writer.DeleteDocuments(new Term("name", "沈"));
            writer.Commit();
            writer.Close();

            Response.Write(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "<BR>");
            // 查询
            search();
        }
       

    }

    private void CreateIndex(IndexWriter writer, string title, string age, string content, string datetime)
    {
      
      
        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.ANALYZED));//存储且不分析不索引
            doc.Add(new Field("job", content, Field.Store.YES, Field.Index.ANALYZED));//存储且索引
            doc.Add(new Field("createdate", datetime, Field.Store.YES, Field.Index.ANALYZED));//存储且索引
            writer.AddDocument(doc);
        }
        catch (FileNotFoundException fnfe)
        {
            throw fnfe;
        }
        catch (Exception ex)
        {
            throw ex;
        }


    }

    public void search()
    {
       
        Analyzer analyzer = null;
        analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

        QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "name", analyzer);
        // 多条件查询
        Query query = parser.Parse("createdate:[20100101 TO 20111230] AND age:[21 TO 25]");
        // 查询结果排序
        Sort sort = new Sort(new SortField("createdate", SortField.LONG));

        //最多返回多少个结果
        int n = 100;
        DirectoryInfo dirInfo = Directory.CreateDirectory(Server.MapPath("~/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, sort);

        // 无结果
        if (docs == null || docs.TotalHits == 0)
        {
        }
        else
        {
            string resultAll = string.Empty;
            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}<BR><BR>", counter, name, age, createdate, job);
                    resultAll = resultAll + result + "<BR>";
                }
                catch (Exception ex)
                {
                    resultAll = resultAll + ex.Message + "<BR>";
                }
                counter++;
            }
            Response.Write(resultAll);
        }

    }

 

 

}