Loading

Lucene.net初探

引言

       在分析同事开发的客户端搜索项目时注意到,搜索的关键是索引,而提到索引就不得不提Lucene.net,思路就是将需要搜索内容写入索引,客户端自己或局域网其他机器搜索时直接搜索索引,从而查看到你共享的信息。

       初探Lucene.net时关注了几个关键类:

       a):IndexReader 索引读取。

       b):IndexWriter  创建索引。

       c):StandardAnalyzer 分词解析,这个应用就比较多了,他解析英文和中文时会拆成单个的字母或者汉字,如果使用PanGuAnalyzer【盘古分析解析】则是拆分成词组搜索。

       d):IndexSearcher 索引搜索。

 

效果

1、写入内容时的索引文件

 

2、输入关键字之后搜索效果

 

代码

 static void Main(string[] args)
        {
            //CreateIndex("Oracle", "甲骨文公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业软件公司,总部位于美国加利福尼亚州的红木滩。1989年正式进入中国市场。2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大软件公司");

            ReadIndex("oracle 公司 IBM");

            Console.ReadKey();

        }

        private static void CreateIndex(string title,string content)
        {
            string indexpath = AppDomain.CurrentDomain.BaseDirectory + "IndexData";
            FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexpath), new NativeFSLockFactory());

            bool isExist = IndexReader.IndexExists(directory); //判断该索引是否存在
            if (isExist)
            {
                if (IndexWriter.IsLocked(directory)) //写入索引时需要解锁
                {
                    IndexWriter.Unlock(directory);
                }
            }

            IndexWriter indexWriter=new IndexWriter(directory,new StandardAnalyzer(),!isExist,IndexWriter.MaxFieldLength.UNLIMITED);

            Document document =new Document();

            Field f1 =new Field("title",title,Field.Store.YES,Field.Index.TOKENIZED);
            Field f2 = new Field("content", content, Field.Store.YES, Field.Index.TOKENIZED);

            document.Add(f1);
            document.Add(f2);

            indexWriter.AddDocument(document);

            indexWriter.Optimize();
            indexWriter.Close();
        }

        private static void ReadIndex(string keywords)
        {
            string indexpath = AppDomain.CurrentDomain.BaseDirectory + "IndexData";
            string title = "";
            string content = "";

            StandardAnalyzer analyzer=new StandardAnalyzer(); //分词
            IndexSearcher searcher=new IndexSearcher(indexpath); //索引搜索  -- 传入索引文件路径

            //MultiFieldQueryParser多字段搜索,一次可以传入多个需要解析的内容, 
            //如果需要一次传入一个就使用QueryParse
            MultiFieldQueryParser parser =new MultiFieldQueryParser(new string[]{"title","content"},analyzer );


            Query query = parser.Parse(keywords);//转化为Lucene内部使用的查询对象
            Hits hits = searcher.Search(query); //执行搜索

            for (int i=0; i<hits.Length(); i++)
            {
                Document doc = hits.Doc(i);
                title += doc.Get("title");
                content += doc.Get("content");
            }
            searcher.Close();

            Console.WriteLine("Title:"+title);
            Console.WriteLine("Content:" + content);

        }
    }

 

posted @ 2014-08-28 16:22  歪头儿在北京  阅读(417)  评论(0编辑  收藏  举报