用Lucene.net对数据库建立索引及搜索<转>

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

最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个测试程序,竟然成功了, 可以实现对数据另类查询的一种方式(通过建索引查询),发表出来,和大家共享.
   其实 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)
        {
            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
            {
                //

            }

        }
    }
}

Lucene.net 是 lucene在java下移植到.net上来的。
    于是 我打算做一个实验看看效果如何 以下是简单代码
   
   1:建立索引 
   我一向力求最简单就实现业务需求。 于是上面的函数 8句话也就搞定了。

Lucene.Net.Analysis.Standard.StandardAnalyzer a=new Lucene.Net.Analysis.Standard.StandardAnalyzer();
   IndexWriter iw=new IndexWriter(@"E:\1\index",a,true);   //E:\1\index  为索引文件存放地址
   string conn="数据库连接字符串";
   using(DataTable dt=SqlHelper.ExecuteDataset(conn,CommandType.Text,"Select top 100 name,Intr from book ").Tables[0])
   {
    foreach(DataRow dr in dt.Rows)
    {
     IndexBook(dr["name"].ToString(),dr["intr"].ToString(),iw);  这是关键
    }

   }
      iw.Optimize();
   iw.Close();
    MessageBox.Show("succes");
    下面请看IndexBook  这个函数
     private void IndexBook(string bookname,string bookintr,IndexWriter writer)
  {
   try
   {
    Document doc = new Document();
    doc.Add(Field.Keyword("bookname", bookname));
    doc.Add(Field.Text("intr", bookintr));

    writer.AddDocument(doc);
   }

   catch (FileNotFoundException fnfe)
   {

   }
  }

索引建立完毕。现在我们开始 进行一些简单搜索
项目建立 我不多说了。打字实在麻烦。

我简单说一下 搜索返回代码

Lucene.Net.Search.IndexSearcher search=new Lucene.Net.Search.IndexSearcher(@"E:\1\index"); //把刚才建立的索引取出来
   Lucene.Net.Search.Query q=Lucene.Net.QueryParsers.QueryParser.Parse("搜索关键字","intr",new Lucene.Net.Analysis.Standard.StandardAnalyzer());
    Lucene.Net.Search.Hits hit =search.Search(q);
   lb.Items.Clear();    //lb是我测试程序中的一个 listbox

   for(int i=0;i<=hit.Length()-1;i++)
   {
    lb.Items.Add(hit.Doc(i).GetField("bookname").StringValue());
   }

实现的效果很简单。 就是 把关键字到 intr(也就是简介)中匹配。返回相关的 bookname  最后返回一个列表。

以上是一个很简单的 搜索例子。
有兴趣的 朋友可以 尝试做一些复杂的搜索.
文章出处:DIY部落(http://www.diybl.com/course/4_webprogram/asp.net/netjs/20071226/93999.html)

时间: 2024-12-27 09:11:41

用Lucene.net对数据库建立索引及搜索<转>的相关文章

Lucene建立索引然后搜索的小Demo

package junitTest; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.luce

Solr的配置及从数据库建立索引

1 . Solr 简介 Solr 是一个基于 Lucene 的 Java 搜索引擎服务器. Solr 提供了层面搜索.命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式).它易于安装和配置,而且附带了一个基于 HTTP 的管理界面. Solr 已经在众多大型的网站中使用,较为成熟和稳定. Solr 包装并扩展了 Lucene ,所以 Solr 的基本上沿用了 Lucene 的相关术语.更重要的是, Solr 创建的索引与 Lucene 搜索引擎库完全兼容.通过对 Sol

为mysql数据库建立索引

前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些开发,但却对如何为数据库建立适当的索引所知较少,因此我起了写一篇相关文章的念头. 最普通的情况,是为出现在where子句的字段建一个索引.为方便讲述,我们先建立一个如下的表. Code代码如下: CREATE TABLE mytable ( id serial primary key, cate

[转]为mysql数据库建立索引

前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些开发,但却对如何为数据库建立适当的索引所知较少,因此我起了写一篇相关文章的念头. 最普通的情况,是为出现在where子句的字段建一个索引.为方便讲述,我们先建立一个如下的表. Code代码如下: CREATE TABLE mytable ( id serial primary key, cate

数据库建立索引的原则

铁律一:天下没有免费的午餐,使用索引是需要付出代价的. 索引的优点有目共睹,但是,却很少有人关心过采用索引所需要付出的成本.若数据库管理员能够对索引所需要付出的代价有一个充分的认识,也就不会那么随意到处建立索引了. 仔细数数,其实建立索引的代价还是蛮大的.如创建索引和维护索引都需要花费时间与精力.特别是在数据库设计的时候,数据库管理员为表中的哪些字段需要建立索引,要调研.要协调.如当建有索引的表中的纪录又增加.删除.修改操作时,数据库要对索引进行重新调整.虽然这个工作数据库自动会完成,但是,需要

【总结】为数据库建立索引的一般依据

建立索引常用的规则如下 1.表的主键.外键必须有索引: 2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引: 5.索引应该建在选择性高的字段上: 6.索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引: 7.复合索引的建立需要进行仔细分析:尽量考虑用单字段索引代替: A.正确选择复合索引中的主列字段,一般是选择性较好的字段: B.复合索引的几个字段是否经常同时以AND方式

Lucene中最简单的索引和搜索示例

package com.jiaoyiping.lucene; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.*; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.inde

lucene 建立索引与查询

Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.Lucene 目前是 Apache Jakarta 家族中的一个开源项目.也是目前最为流行的基于 Java 开源全文检索工具包. 目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能.Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行

数据库、数据表建立索引的原则

数据库建立索引的原则 1,确定针对该表的操作是大量的查询操作还是大量的增删改操作. 2,尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引. 3,尝试建立复合索引来进一步提高系统性能.修改复合索引将消耗更长时间,同时,复合索引也占磁盘空间. 4,对于小型的表,建立索引可能会影响性能 5,应该避免对具有较少值的字段进行索引. 6,避免选择大型数据类型的列作为索引. 索引建立的原则 索引查询是数据库中重要的记录查询方法,要不要进入索引以及在那些字段上建