用Lucene.net对数据库建立索引及搜索。
简要说一下过程,首先是从数据库里取出内容,在磁盘上建立了索引文件。之后每次进行数据检索时从索引文件中检索数据。
| 字段名称 | 字段类型 | 字段含义 |
| id | varchar | 编号 |
| title | vachar | 标题 |
| content | text | 内容 |
aspx文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestLLLL._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<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="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Search" runat="server"
Text="搜索" onclick="Search_Click"></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源文件
namespace TestLLLL
{
public partial class _Default : System.Web.UI.Page
{
string connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HttpContext.Current.Server.MapPath("~/db1.mdb");
protected void Page_Load(object sender, EventArgs e)
{
//OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HttpContext.Current.Server.MapPath("~/check.mdb"));
if (!IsPostBack)
{
//打开数据库表
OleDbDataReader myred = OpenTable();
//建立索引
IndexWriter writer = CreateIndex(myred);
}
}
public OleDbDataReader OpenTable()
{
OleDbConnection mycon = new OleDbConnection(connstr);
mycon.Open();
OleDbCommand mycom = new OleDbCommand("select id,title,content from userblog order by id", mycon);
return mycom.ExecuteReader();
}
public IndexWriter CreateIndex(OleDbDataReader 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 queryKey, string queryContent)
{
Hits hits = null;
try
{
IndexSearcher mysea = new IndexSearcher("c:/index/");
Query query = QueryParser.Parse(queryContent, queryKey, new ChineseAnalyzer());
hits = mysea.Search(query);
}
catch (Exception e)
{
Response.Write(e);
}
return hits;
}
protected void Search_Click(object sender, 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("title", TextBox1.Text);
Document doc;
if (myhit != null)
{
for (int i = 0; i < myhit.Length(); i++)
{
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();
}
}
}