用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="">
<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="">
<tr>
<td><asp:datagrid id="SearGrid" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateColumn>
<HeaderTemplate>
搜索结果:
</HeaderTemplate>
<ItemTemplate>
<table width="100%" border="">
<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=;i<myhit.Length();i++)
{
Document doc=myhit.Doc(i);
myrow=mytab.NewRow();
myrow[]=doc.Get("id").ToString();
myrow[]=doc.Get("title").ToString();
myrow[]=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[])
{
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=;i<=hit.Length()-;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)

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

  1. 千万级MySQL数据库建立索引,提高性能的秘诀

    实践中如何优化MySQL 实践中,MySQL的优化主要涉及SQL语句及索引的优化.数据表结构的优化.系统配置的优化和硬件的优化四个方面,如下图所示: SQL语句及索引的优化 SQL语句的优化 SQL语 ...

  2. 为mysql数据库建立索引

    前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...

  3. Mysql数据库建立索引的优缺点有哪些?

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息. 什么是索引 数据库索引好比是一本书前面的目录,能加快数据库的查询速度. 例如这样一个查询:select * ...

  4. 使用Elasticsearch-jdbc为MySQL数据库建立索引

    elasticsearch-jdbc 环境 Ubuntu 14.04 JDK 1.8.0_66 Elasticsearch 2.3.1 Elasticsearch-jdbc 2.3.1.0 Elast ...

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

    package com.jiaoyiping.lucene; import org.apache.lucene.analysis.standard.StandardAnalyzer; import o ...

  6. lucene索引并搜索mysql数据库[转]

    由于对lucene比较感兴趣,本人在网上找了点资料,终于成功地用lucene对mysql数据库进行索引创建并成功搜索,先总结如下: 首先介绍一个jdbc工具类,用于得到Connection对象: im ...

  7. Lucene建立索引搜索入门实例

                                第一部分:Lucene建立索引 Lucene建立索引主要有以下两步:第一步:建立索引器第二步:添加索引文件准备在f盘建立lucene文件夹,然后 ...

  8. Lucene.net 从创建索引到搜索的代码范例

    关于Lucene.Net的介绍网上已经很多了在这里就不多介绍Lucene.Net主要分为建立索引,维护索引和搜索索引Field.Store的作用是通过全文检查就能返回对应的内容,而不必再通过id去DB ...

  9. (转)Mysql哪些字段适合建立索引

    工作中处理数据时,发现某个表的数据达近亿条,所以要为表建索引提高查询性能,以下两篇文章总结的很好,记录一下,以备后用. 数据库建立索引常用的规则如下: 1.表的主键.外键必须有索引: 2.数据量超过3 ...

随机推荐

  1. POJ 2226 Muddy Fields(二分匹配 巧妙的建图)

    Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R ...

  2. File file:/data1/hadoop/yarn/local/usercache/hp/appcache/application_* does not exi

    AM Container for appattempt_1453292851883_0381_000002 exited with exitCode: -1000For more detailed o ...

  3. window10系统下使用python版本实现mysql查询

    参考文档: 兔大侠整理的MySQL-Python(MySQLdb)封装类 Python安装模块出错(ImportError: No module named setuptools)解决方法 环境 (w ...

  4. 图论:最短路-Dijkstra

    Dijkstra+堆优化具有稳定的时间复杂度,在一些数据范围要求比较严格(准确来说是图比较苛刻)的时候能够保证稳定的时间复杂度 但是Dijkstra不能够解决负边权的问题,所以在使用的时候一定要仔细读 ...

  5. 【设计模式】 模式PK:包装模式群PK

    1.概述 我们讲了这么多的设计模式,大家有没有发觉在很多的模式中有些角色是不干活的?它们只是充当黔首作用,你有问题,找我,但我不处理,我让其他人处理.最典型的就是代理模式了,代理角色接收请求然后传递到 ...

  6. 【bzoj3648】环套树+点分治+树状数组

    tree 1s 128M  by hzw czy神犇种了一棵树,他想知道地球的质量 给定一棵n个点的树,求树上经过点的个数≥K的路径数量ans 对于部分数据,树上某两点间会多出最多一条无向边 输入数据 ...

  7. 【BZOJ】2200: [Usaco2011 Jan]道路和航线

    [题意]给定n个点的图,正权无向边,正负权有向边,保证对有向边(u,v),v无法到达u,求起点出发到达所有点的最短距离. [算法]拓扑排序+dijkstra [题解]因为有负权边,直接对原图进行spf ...

  8. Spring整合Quartz分布式调度(山东数漫江湖)

    前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...

  9. HDU 1069 Monkey and Banana (dp)

    题目链接 Problem Description A group of researchers are designing an experiment to test the IQ of a monk ...

  10. CSS 竖线颜色渐变

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...