using System;
using System.Collections.Generic;
using System.Text;
using Lucene.Net;
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.Store;
using Lucene.Net.Util;

namespace LuceneDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            LuceneTest test = new LuceneTest();
            test.Create();
            test.Search();
            Console.Read();
        }
    }
    public class LuceneTest
    {
        private const string FieldName = "name";
        private const string FieldValue = "value";
        private Directory directory = FSDirectory.GetDirectory("C:\\",false);
        //private Directory directory = RAMDirectory(); //使用内存存储索引
        private Analyzer analyzer = new StandardAnalyzer();

        public void Create()
        {
            IndexWriter writer = new IndexWriter(directory, analyzer, true);
            for (int i = 1; i <= 100; i++)
            {
                Document document = new Document();
                document.Add(new Field(FieldName, "name" + i, Field.Store.YES,
                Field.Index.UN_TOKENIZED));
                document.Add(new Field(FieldValue, "Hello, World!", Field.Store.YES,
                Field.Index.TOKENIZED));
                writer.AddDocument(document);//索引添加
            }
            writer.Optimize();//索引优化
            writer.Close();
        }
        public void Search()
        {
            Query query = new QueryParser(FieldName, analyzer).Parse("name*");
            IndexSearcher searcher = new IndexSearcher(directory);
            Hits hits = searcher.Search(query);
            Console.WriteLine("符合条件记录:{0}; 索引库记录总数:{1}", hits.Length(), searcher.MaxDoc());
            for (int i = 0; i < hits.Length(); i++)
            {
                int docId = hits.Id(i);
                string name = hits.Doc(i).Get(FieldName);
                string value = hits.Doc(i).Get(FieldValue);
                float score = hits.Score(i);
                Console.WriteLine("{0}: DocId:{1}; Name:{2}; Value:{3}; Score:{4}",i + 1, docId, name, value, score);
            }
            searcher.Close();
        }
    }
}

除了FSDirectory,还可以使用RAMDirectory。
注意:FSDirectory.GetDirectory 的create参数,为true时将删除已有索引库文件,可以通过IndexReader.IndexExists() 方法判断。
将索引库载入内存,以提高搜索速度。
private Directory directory = new RAMDirectory(FSDirectory.GetDirectory("c:\\", false));

private Directory directory = new RAMDirectory("c:\\");

CSharp Lucene.Net 索引 搜索 最后修改于 2011-05-28 09:23:35
上一篇