用Lucene.net對數據庫建立索引及搜索

       最近我一直在研究 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>

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 窗體設計器生成的代碼

        
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
            
{
                
//

            }

            

        
        }

    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章