今天工作不是特别多,在逛园子的时候看到了Lucene.Net,所以自己也参照别人的 博文自己动手写了个DEMO(虽然很多是参考过来的,不过自己动手更容易记住嘛!)。废话不多说,先上个图,把以前看到的几个好的jquery插件也用上 去了(JQuery关键字高亮度、JQuery分页),不记得地址了,就没有留作者的网址。
第一步,下载DLL文件,我这里用的是2.9的版本,貌似说不更新了。
第二步,把DLL引用到你的项目中,然后就是生成索引文件。
/// <summary> |
/// 执行查询语句,返回SqlDataReader
|
/// </summary>
|
/// <param name="strSQL">查询语句</param>
|
/// <returns>SqlDataReader</returns>
|
public static SqlDataReader ExecuteReader( string strSQL)
|
{
|
SqlConnection connection = new SqlConnection(connectionString);
|
SqlCommand cmd = new SqlCommand(strSQL, connection);
|
try
|
{
|
connection.Open();
|
SqlDataReader myReader = cmd.ExecuteReader();
|
return myReader;
|
}
|
catch (System.Data.SqlClient.SqlException e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
//对数据库中的字段建立索引 |
public static IndexWriter CreateIndex(SqlDataReader myred)
|
{
|
IndexWriter writer = new IndexWriter( "D:/index/" , new StandardAnalyzer(), true ); //索引的存储位置
|
try
|
{
|
while (myred.Read())
|
{
|
Document doc = new Document();
|
doc.Add( new Field( "ID" , myred[ "ID" ].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED)); //其中ID、Name、Add都是数据库中的字段名,这个应该可以看明白的吧
|
doc.Add( new Field( "Name" , myred[ "Name" ].ToString(), Field.Store.YES, Field.Index.TOKENIZED));
|
doc.Add( new Field( "Add" , myred[ "Add" ].ToString(), Field.Store.YES, Field.Index.TOKENIZED));
|
writer.AddDocument(doc);
|
}
|
writer.Optimize(); //优化索引
|
writer.Close();
|
myred.Close();
|
}
|
catch (Exception e)
|
{
|
myred.Close();
|
}
|
return writer;
|
}
|
好了,索引文件已经建好了。
第三步,查询我们需要的数据鸟。
Stopwatch sw = new Stopwatch();
|
sw.Start(); //用于测试程序消耗时间
|
string path = "D:/index/" ; //索引存储目录
|
Sort sort = new Sort( new SortField( "ID" , SortField.DOC, false )); //排序
|
IndexSearcher searcher = new IndexSearcher(path);
|
QueryParser q = new QueryParser( "Name" , new StandardAnalyzer());
|
Query query = q.Parse(strwhere);
|
Hits hits = searcher.Search(query, sort);
|
pcount = hits.Length();
|
if (hits.Length() > 0)
|
{
|
int num = pagesize + pages * pagesize;
|
int emdnum = pages * pagesize; //这里是因为用到分页,采取的方式是从第几条开始,取多少条的方式来分页,页数越大,性能越差,200W条数据跳到最后页需要4M,求指教
|
if (hits.Length() < num)
|
{
|
num = hits.Length();
|
}
|
for ( int i = emdnum; i < num; i++)
|
{
|
Document doc = hits.Doc(i);
|
str += "<p><a href=\"Show.aspx?ID=" + doc.Get( "ID" ) + "\" title=\"" + doc.Get( "Name" ) + "\">" + doc.Get( "Name" ) + "</a></p>" ;
|
}
|
}
|
searcher.Close();
|
sw.Stop();
|
str += "<p>搜索结果为 " + hits.Length() + " 个 耗时:" + sw.ElapsedMilliseconds.ToString() + "毫秒</p>" ;
|
这样基本查询功能就OK了。写篇博客记录下,给自己加深下印象。明天有时间还得捣鼓捣鼓分词,内置分词不是很好。
代码写的很乱,还是提供个下载。(点击下载)