[转]用Lucene.net对数据库建立索引及搜索
用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(); } } }