3.查看获取注册全文索引的列
获取注册全文索引的列的SQL语句如下:
use North Wind
exec sp help fulltext columns"products"
4.通用方法
使用下面的SQL语句可以返回全文目录的名称和整数标识符,全文目录根目录,全文目录的填充状态,链接到此全文目录的表的数目。
use North Wind
exec sp help fulltext catalogs
在企业管理器中,右键单击“Products”表,在弹出的快捷菜单中依次选择“全文索引表”和“编辑全文检索”,将运行全文索引向导,可以查看于全文目录有关的一切信息。
4.5.5删除和重建全文索引
1.删除全文索引的元数据
删除全文索引的元数据有两种方法:
(1)使用SQL语句
执行下面的SQL语句,取消将products表注册为用于全文处理。这将除去该表有关全文索引的元数据。直到下一次完全填充或除去全文目录之前,现有的全文索引保持原样,但处于不使用状态。
use North Wind
exec sp fulltext table"products","drop"
(2)使用企业管理器
在企业管理器中,右键单击“Products”表,在弹出的快捷菜单中依次选择“全文索引表”和“从表中删除全文索引”。
2.删除全文目录
删除全文目录的方法有两种。
(1)使用SQL语句
执行下面的SQL语句,从文件系统中删除全文目录,并从系统表中移除元数据。注意:要删除全文目录,必须首先删除它里面的索引。
use North Wind
exec sp fulltext catalog"pro Catalog","drop"
(2)使用企业管理器
在企业管理器中,右键单击全文目录“pro Catalog”,在弹出的快捷菜单中选择“删除”。
如果要删除系统中所有在SQL Server里不含元数据的全文目录,要执行下面语句:
use North Wind
exec sp fulltext service"Clean Up"
(3)重建全文目录
执行下面的SQL语句,从文件系统中重建全文目录。
use North Wind
exec sp fulltext catalog"pro Catalog","Rebuild"
4.6利用SQL Server全文搜索实现搜索引擎
有了前面学习的知识,下面就可以利用SQL Server全文检索来开发一个全文搜索引擎。
这个程序是非常好写的,也是非常简单的,因为它只是起到了传递SQL语句和显示搜索结果的作用。使用的技术是ASP.NET1.1(基于VB.NET)+SQL Server2000。
4.6.1数据库准备
这个全文搜索引擎基于SQL Server内置的全文搜索功能,应用程序上只需要做一个检索界面即可。
这里使用前面建立的tianen数据库作为检索数据库,检索的表格是test。采用CONTAINS谓词进行检索。
4.6.2桌面应用实现的全文搜索
建立一个WinForm工程,只含有一个窗体Form1.vb。关键代码如以下案例所示。
案例名称:桌面应用实现的全文搜索
程序名称:Form1.vb
Imports System.Data
Imports System.Data.SqlClient
PublicClass Form1
Inherits System.Windows.Forms.Form
"注:此处略去Windows窗体设计器生成的代码,程序的核心代码在单击按钮的事件中
Private SubButton1Click(ByVal senderAs System.Object,ByVal eAs System.EventArgs)
HandlesButton1.Click
Dim soAs String=input.Text.Trim
Dim connAs New
SqlConnection("server=localhost;database=tianen;uid=sa;pwd=;")
Dim sqlAs String=
"select*from test whereCONTAINS(content,′"""&; so &;"""")"
Dim dsAs NewDataSet
Dim adpAs New SqlDataAdapter(sql,conn)
adp.Fill(ds,"good")
DG.DataSource=ds.Tables("good").DefaultView
End Sub
EndClass
4.6.3Web应用实现的全文搜索
与桌面应用同理,这里只包含一个文件search.aspx,下面是它的后置代码文件片断。
案例名称:Web应用实现的全文搜索
程序名称:search.aspx.vb
Imports System.Data
Imports System.Data.SqlClient
PublicClass search
Inherits System.Web.UI.Page
"注:此处略去Web窗体设计器生成的代码,程序的核心代码在单击按钮的事件中
Private Sub Page Load(ByVal senderAs System.Object,ByVal eAs System.EventArgs)HandlesMyBase.Load
′在此处放置初始化页的用户代码
End Sub
Private SubButton1Click(ByVal senderAs System.Object,ByVal eAs System.EventArgs)HandlesButton1.Click
Dim soAs String=input.Text.Trim
Dim connAs New
SqlConnection("server=localhost;database=tianen;uid=sa;pwd=;")
Dim sqlAs String=
"select*from test whereCONTAINS(content,′"""&; so &;"""")"
Dim dsAs NewDataSet
Dim adpAs New SqlDataAdapter(sql,conn)
adp.Fill(ds,"good")
DG.DataSource=ds.Tables("good").DefaultView
DG.DataBind()
End Sub
EndClass
提示:
如果要实现这样的功能,在搜索框中输入“大禹、涂山氏”,表示搜索同时含有“大禹”和“涂山氏”这两个词的记录,该如何实现呢?
根据CONTAINS的语法,要构造出CONTAINS(content,′"大禹"AND"涂山氏""),这就涉及对输入的词语进行切分了。笔者建议的一个方法是:先对输入的搜索词汇进行验证,避免对数据库不利的字符混入,然后将输入的词汇除去两边的空格,然后剩下的内容按照中间的空格切分,使其分成多个词语,然后构造成“AND”连接的字符串传递给程序,由CONTAINS实现。
或者,直接采用FREETEXT搜索,这个更加简易一些,只是人工控制性差些。
4.7文件数据的搜索
4.7.1文件数据搜索的概述
前面曾经提到过,使用SQL Server的全文检索组件可以对一些文件实现检索,这项功能是非常重要的。因为有大量数字化信息并不以结构化的形式存储在数据库中,大量的数据依然处于非结构化状态,以文档形式存储在文件系统中。对它们实现检索是非常重要的。SQLServer全文检索支持的文件包括Office系列的Word文档,Powerpoint文档和HTML文档等。
本节介绍如何去执行对文件建立索引和执行检索。
对文件执行的检索包括以下两种。
①属性检索:对文档应用筛选来提取属性,如作者、主体、字数等,然后对这些属性进行检索。
②全文检索:从文档中提取出全部文本信息,然后过滤掉干扰词,建立全文索引。
第一种检索比较简单,应用也少,遍历文件读取属性即可,方法俯拾即是。第二种检索在SQL2000中有完善的解决方案,只需把文件存储到image类型的列中,然后对这一列启用全文检索。
4.7.2文件数据搜索的实现
下面实现一个程序,把文件存入数据库的image类型字段中,然后对数据库启用全文检索,执行搜索。
使用的技术是ASP.NET1.1(基于VB.NET)+SQL Server2000。
1.建立数据库
在SQL Server中建立数据库,名为“tianen Image”,内含一个表格,名为“test”。这个表格用来存储二进制文件。此表格包含4列:id,int类型,为主键,自动增长,记录文件序号;fname,varchar(20)类型,存储文件名称;fext,varchar(20)类型,存储文件扩展名;fcontent,image类型,存储二进制文件的内容。
2.编写文件上传器
下面实现一个程序,用来将文件上传到数据库中,将文件名写入fname字段,扩展名写入fext字段,文件的二进制内容写入fcontent字段。
程序只包含一个文件,tianenImage.aspx。
案例名称:二进制文件的全文搜索
程序名称:tianenImage.aspx
<%@ page language="vb"%>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
<%@ Import Namespace="System.IO"%>
< runat="server">
SubButton1Click(ByVal senderAs System.Object,ByVal eAs System.EventArgs)
"数据库连接串
dimConnStr as String=
"server=localhost;uid=sa;pwd=;database=tianenImage;"
′文件名
Dim fnameAs String=Path.GetFileName(up.PostedFile.FileName)
"扩展名
Dim fextAs String=Path.GetExtension(up.PostedFile.FileName)
"二进制文件内容
Dim fcontent(up.PostedFile.ContentLength)AsByte
"将二进制文件内容读入fcontent
up.PostedFile.InputStream.Read(fcontent,0,up.PostedFile.ContentLength)
"将数据插入数据库
Dim connAs New SqlConnection(ConnStr)
Dim commAs New SqlCommand("insert into test(fname,fext,fcontent)values(@ fname,@ fext,@ fcontent)",conn)
comm.Parameters.Add("@ fname",fname)
comm.Parameters.Add("@ fext",fext)
comm.Parameters.Add("@ fcontent",fcontent)
Try
conn.Open()
comm.ExecuteNonQuery()
Dim tempAs String
temp="file name:"&; fname
temp &;="<br>file extension:"&; fext
l.Text=temp
Catch exAs Exception
l.Text=ex.Message
Finally
If Not conn Is Nothing Then
conn.Close()
End If
End Try
End Sub</>
<!——上传文件界面——>
<FORM id="Form1"method="post"runat="server">
上传文件到数据库中:<INPUT id="up"type="file"name="File1"runat="server"> ;
<asp:button id="Button1"runat="server"Text="上传"
OnClick="Button1Click"></asp:button><BR>
<asp:label id="l"runat="server"Height="14px"Width="432px"></asp:label>
</FORM>
单击“浏览”按钮,然后从打开的“选择文件”对话框中选择文件。选择后单击“上传”按钮,即可将文件上传到数据库中。
查看数据库,文件果然上传成功了。