用Lucene.net对数据库建立索引及搜索2

其实 Lucene.net 对数据库建索引很简单,只要把数据表里面的记录读出来,然后对每个字段索引就行了.本文中数据库的内容是某个博客表-userblog表。

1.表结构:
字段名称         字段类型         字段含义
id                Varchar(11)          编号
title              Varchar(50)          标题
content         Text                    内容

2.程序流程
1)   打开数据库;
2)   建立索引;
3)    根据索引进行全文搜索.


4.附源码:
aspx文件:
<%@ 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 窗体设计器生成的代码#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)
posted @ 2009-07-27 09:18  周骏  阅读(708)  评论(0编辑  收藏  举报