开发者社区> 科技小毛> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

用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文件:

ContractedBlock.gifExpandedBlockStart.gifCode
<%@ 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句话也就搞定了。

 

ContractedBlock.gifExpandedBlockStart.gifCode
 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)
   {
                   
   }
  }

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

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

 

ContractedBlock.gifExpandedBlockStart.gifCode
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)

 

 

本文转自温景良(Jason)博客园博客,原文链接:http://www.cnblogs.com/wenjl520/archive/2009/07/25/1530679.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Lucene.Net 2.3.1开发介绍 —— 四、搜索(二)
原文:Lucene.Net 2.3.1开发介绍 —— 四、搜索(二) 4.3 表达式用户搜索,只会输入一个或几个词,也可能是一句话。输入的语句是如何变成搜索条件的上一篇已经略有提及。 4.3.1 观察表达式在研究表达式之前,一定要知道,任何一个Query都会对于一个表达式。
707 0
Lucene.Net 2.3.1开发介绍 —— 四、搜索(三)
原文:Lucene.Net 2.3.1开发介绍 —— 四、搜索(三) Lucene有表达式就有运算符,而运算符使用起来确实很方便,但另外一个问题来了。 代码 4.3.4.1Analyzer analyzer = new StandardAnalyzer();QueryParser parser ...
717 0
Lucene.Net 2.3.1开发介绍 —— 四、搜索(一)
原文:Lucene.Net 2.3.1开发介绍 —— 四、搜索(一) 既然是内容筛选,或者说是搜索引擎,有索引,必然要有搜索。搜索虽然与索引有关,那也只是与索引后的文件有关,和索引的程序是无关的,因此,搜索和索引一般是分开部署。
645 0
lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)
添加:2013-12-25 更新:2013-12-26 新增分页功能。 更新:2013-12-27 新增按分类查询功能,调整索引行新增记录的图片字段。
902 0
用lucene为数据库搜索建立增量索引
用 lucene 建立索引不可能每次都重新开始建立,而是按照新增加的记录,一次次的递增建立索引的IndexWriter类,有三个参数 IndexWriter writer = new Inde...
541 0
Lucene.Net 删除索引DeleteDocuments的注意事项
Lucene.Net 在删除索引时,经常会出现代码成功执行,但索引并未正直删除的现象,总结一下,要注意以下因素: 1.在创建Term时,注意Term的key一定要是以"词"为单位,否则删除不成功,例如:添加索引时,如果把"d:\doc\id.
566 0
艾伟_转载:Lucene.net多字段多索引目录搜索
Lucene.net是目前在.net环境中被普遍使用的全文索引的开源项目,这次在项目的开发中也使用它进行全文索引。在开发过程中碰到一些小问题就是对多字段和多索引目录进行搜索。 1、多字段搜索就是同时要一个以上的字段中的内容进行比较搜索,类似概念在SQL中就是select * from Table where a like '%query%' or b like '%query%'。
590 0
艾伟_转载:Lucene.net操作索引库
删除 (软删除,仅添加了删除标记。调用IndexWriter.Optimize() 后真正删除)IndexReader reader = IndexReader.Open(directory);// 删除指定序号(DocId)的 Document。
608 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
MongoDB5.0搜索附近的人车物
立即下载
《开放搜索查询分析服务架构分享》
立即下载
Phoenix 全局索引原理与实践
立即下载