新手也玩—Lucene.Net

新手也玩—Lucene.Net

今天工作不是特别多,在逛园子的时候看到了Lucene.Net,所以自己也参照别人的博文自己动手写了个DEMO(虽然很多是参考过来的,不过自己动手更容易记住嘛!)。废话不多说,先上个图,把以前看到的几个好的jquery插件也用上去了(JQuery关键字高亮度、JQuery分页),不记得地址了,就没有留作者的网址。

第一步,下载DLL文件,我这里用的是2.9的版本,貌似说不更新了。

第二步,把DLL引用到你的项目中,然后就是生成索引文件。

 1 /// 
 2     /// 执行查询语句,返回SqlDataReader
 3     /// 
 4     /// 查询语句
 5     /// SqlDataReader
 6     public static SqlDataReader ExecuteReader(string strSQL)
 7     {
 8         SqlConnection connection = new SqlConnection(connectionString);
 9         SqlCommand cmd = new SqlCommand(strSQL, connection);
10         try
11         {
12             connection.Open();
13             SqlDataReader myReader = cmd.ExecuteReader();
14             return myReader;
15         }
16         catch (System.Data.SqlClient.SqlException e)
17         {
18             throw new Exception(e.Message);
19         }
20 
21     }
 1 //对数据库中的字段建立索引 
 2     public static IndexWriter CreateIndex(SqlDataReader myred)
 3     {
 4 
 5         IndexWriter writer = new IndexWriter("D:/index/", new StandardAnalyzer(), true);   //索引的存储位置
 6         try
 7         {
 8             while (myred.Read())
 9             {
10                 Document doc = new Document();
11                 doc.Add(new Field("ID", myred["ID"].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));//其中ID、Name、Add都是数据库中的字段名,这个应该可以看明白的吧
12                 doc.Add(new Field("Name", myred["Name"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));
13                 doc.Add(new Field("Add", myred["Add"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));
14                 writer.AddDocument(doc);
15             }
16             writer.Optimize(); //优化索引 
17             writer.Close();
18             myred.Close();
19         }
20         catch (Exception e)
21         {
22             myred.Close();
23         }
24         return writer;
25     }

好了,索引文件已经建好了。

第三步,查询我们需要的数据鸟。

 1 Stopwatch sw = new Stopwatch(); 
 2         sw.Start(); //用于测试程序消耗时间
 3         string path = "D:/index/";  //索引存储目录 
 4         Sort sort = new Sort(new SortField("ID", SortField.DOC, false));//排序  
 5 
 6         IndexSearcher searcher = new IndexSearcher(path);
 7         QueryParser q = new QueryParser("Name", new StandardAnalyzer());
 8         Query query = q.Parse(strwhere);
 9         Hits hits = searcher.Search(query, sort);
10         pcount = hits.Length();
11         if (hits.Length() > 0)
12         {
13             int num = pagesize + pages * pagesize;
14          int emdnum = pages * pagesize;//这里是因为用到分页,采取的方式是从第几条开始,取多少条的方式来分页,页数越大,性能越差,200W条数据跳到最后页需要4M,求指教
15             if (hits.Length() < num)
16             {
17                 num = hits.Length();
18 
19             }
20             for (int i = emdnum; i < num; i++)
21             {
22                 Document doc = hits.Doc(i);
23                 str += "

" + doc.Get("ID") + "\" title=\"" + doc.Get("Name") + "\">" + doc.Get("Name") + "

"; 24 } 25 } 26 searcher.Close(); 27 sw.Stop(); 28 str += "

搜索结果为 " + hits.Length() + " 个 耗时:" + sw.ElapsedMilliseconds.ToString() + "毫秒

";

这样基本查询功能就OK了。写篇博客记录下,给自己加深下印象。明天有时间还得捣鼓捣鼓分词,内置分词不是很好。

 

代码写的很乱,还是提供个下载。(点击下载)

你可能感兴趣的:(新手也玩—Lucene.Net)