最近我一直在研究 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
<%
@ Page language
=
"
c#
"
Codebehind
=
"
WebForm1.aspx.cs
"
AutoEventWireup
=
"
false
"
Inherits
=
"
WebApplication4.WebForm1
"
%>
<! 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 >& nbsp;
< 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 >& nbsp; </ td >
</ tr >
</ table >
</ ItemTemplate >
</ asp:TemplateColumn >
</ Columns >
</ asp:datagrid ></ td >
</ tr >
</ table >
</ form >
</ body >
</ HTML >
<! 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 >& nbsp;
< 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 >& nbsp; </ td >
</ tr >
</ table >
</ ItemTemplate >
</ asp:TemplateColumn >
</ Columns >
</ asp:datagrid ></ td >
</ tr >
</ table >
</ form >
</ body >
</ HTML >
cs代码
using
System;
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 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.Search.Click += new System.EventHandler(this.Search_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
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
...{
//
}
}
}
}
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 窗体设计器生成的代码#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
...{
this.Search.Click += new System.EventHandler(this.Search_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
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
...{
//
}
}
}
}