最近我一直在研究 Lucene.net ,發現Lucene.net對數據庫方面建索引的文章在網上很少見,其實它是可以對數據庫進行索引的,我閒着沒事,寫了個測試程序,竟然成功了, 可以實現對數據另類查詢的一種方式(通過建索引查詢),發表出來,和大家共享.
其實 Lucene.net 對數據庫建索引很簡單,只要把數據表裏面的記錄讀出來,然後對每個字段索引就行了.本文中數據庫的內容是某個博客表-userblog表。
1.表結構:
字段名稱 字段類型 字段含義
id Varchar(11) 編號
title Varchar(50) 標題
content Text 內容
2.程序流程
1) 打開數據庫;
2) 建立索引;
3) 根據索引進行全文搜索.
4.附源碼:
aspx文件:
如轉載請註明出處,謝謝!!
wangkun by 2007-5-1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>使用Lucene.net建立簡單的數據庫搜索程序</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<table width="100%" border="0">
<tr>
<td>
<asp:textbox id="tj" runat="server"></asp:textbox><asp:button id="Search" runat="server" Text="搜索"></asp:button></td>
</tr>
</table>
<table width="100%" border="0">
<tr>
<td><asp:datagrid id="SearGrid" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateColumn>
<HeaderTemplate>
搜索結果:
</HeaderTemplate>
<ItemTemplate>
<table width="100%" border="0">
<tr>
<td>id:<%# DataBinder.Eval(Container.DataItem,"id") %>
</td>
</tr>
<tr>
<td>標題:
<%# DataBinder.Eval(Container.DataItem,"title") %>
</td>
</tr>
<tr>
<td>內容:
<%# DataBinder.Eval(Container.DataItem,"content") %>
</td>
</tr>
<tr>
<td> </td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:datagrid></td>
</tr>
</table>
</form>
</body>
</HTML>
cs代碼
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Lucene.Net;
using Lucene.Net.Index;
using Lucene.Net.Documents;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Analysis.Cn;
namespace WebApplication4
{
/// <summary>
/// WebForm1 的摘要說明。
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.TextBox tj;
protected System.Web.UI.WebControls.Button Search;
protected System.Web.UI.WebControls.DataGrid SearGrid;
public string connstr="server=.;database=TopWin2;uid=sa;pwd=";
private void Page_Load(object sender, System.EventArgs e)
{
// 在此處放置用戶代碼以初始化頁面
if (!Page.IsPostBack)
{
//打開數據庫表
SqlDataReader myred=OpenTable();
//建立索引
IndexWriter writer=CreateIndex(myred);
}
}
public SqlDataReader OpenTable()
{
SqlConnection mycon=new SqlConnection(connstr);
mycon.Open();
SqlCommand mycom=new SqlCommand("select id,title,content from userblog order by id",mycon);
return mycom.ExecuteReader();
}
public IndexWriter CreateIndex(SqlDataReader myred)
{
IndexWriter writer = new IndexWriter("c:/index/", new ChineseAnalyzer(), true);
try
{
//建立索引字段
while(myred.Read())
{
Document doc=new Document();
doc.Add(Field.Keyword("id",myred["id"].ToString()));
doc.Add(Field.Text("title",myred["title"].ToString()));
doc.Add(Field.Text("content",myred["content"].ToString()));
writer.AddDocument(doc);
}
writer.Optimize();
writer.Close();
}
catch(Exception e)
{
Response.Write(e);
}
return writer;
}
public Hits seacher(String queryString)
{
Hits hits=null;
try
{
IndexSearcher mysea=new IndexSearcher("c:/index/");
Query query=QueryParser.Parse(queryString,"content",new ChineseAnalyzer());
hits=mysea.Search(query);
}
catch(Exception e)
{
Response.Write(e);
}
return hits;
}
Web 窗體設計器生成的代碼
private void Search_Click(object sender, System.EventArgs e)
{
DataRow myrow;
DataTable mytab=new DataTable();
mytab.Columns.Add("id");
mytab.Columns.Add("title");
mytab.Columns.Add("content");
mytab.Clear();
Hits myhit=seacher(this.tj.Text.Trim());
if (myhit!=null)
{
for(int i=0;i<myhit.Length();i++)
{
Document doc=myhit.Doc(i);
myrow=mytab.NewRow();
myrow[0]=doc.Get("id").ToString();
myrow[1]=doc.Get("title").ToString();
myrow[2]=doc.Get("content").ToString();
mytab.Rows.Add(myrow);
myrow.AcceptChanges();
}
this.SearGrid.DataSource=mytab;
this.SearGrid.DataBind();
}
else
{
//
}
}
}
}