当前位置:文档之家› Sql2008 全文索引详解

Sql2008 全文索引详解

Sql2008 全文索引详解
Sql2008 全文索引详解

Sql2008 全文索引详解

1.

使用全文搜索查询数据

在数据库中快速搜索数据,使用索引可以提高搜索速度,然而索引一般是建立在数字型

或长度比较短的文本型字段上的,比如说编号、姓名等字段,如果建立在长度比较长的文本型字段上,更新索引将会花销很多的时间。如在文章内容字段里用lik e 语句搜索一个关键字,

当数据表里的内容很多时,这个时间可能会让人难以忍受。

在SQL Server 中提供了一种名为全文索引的技术,可以大大提高从长字符串里搜索数

据的速度,在本章里,将会对全文索引进行详细的介绍。

1.1

全文索引的介绍

全文索引与普通的索引不同,普通的索引是以B-tree 结构来维护的,而全文索引是一

种特殊类型的基于标记的功能性索引,是由Microsoft SQL Server 全文引擎服务创建和维护的。

使用全文索引可以快速、灵活地为存储在SQL Server 数据库中的文本数据创建基于关

键字查询的索引,与lik e 语句不同,lik e 语句的搜索是适用于字符模式的查询,而全文索引

是根据特定语言的规则对词和短语的搜索,是针对语言的搜索。

在对大量的文本数据进行查询时,全文索引可以大大地提高查询的性能,如对于几百万

条记录的文本数据进行lik e 查询可能要花几分钟才能返回结果,而使用全文索引则只要几秒

钟甚至更少的时间就可以返回结果了。

1.2

全文索引中常用的术语

由于全文索引中使用了较多的新的术语,在此先介绍这些术语:

l 全文索引:一种特殊的索引,能在给定的列中存储有关重要的词及位置的信息,

使用这些信息可以快速进行全文查询,搜索包括特定词或词组的行。

l 全文目录:全文目录是存储全文索引的地方,全文目录必须驻留在与SQL Serve

r 实例相关联的本地硬盘上,每个全文目录可用于满足数据库内的一个或多个表的

索引需求。

l 断字符与词干分析器:断字符与词干分析器都是用于对全文索引的数据进行语言

分析的。语言分析通常都会涉及到查找词的边界和组合动词两个方面,其中要查找

词的边界,也就是确定哪几个字符是?词?,称之为?断字?。__________组合动词也就是词干分

析,用于分析词。根据语言的不同,语言分析规则也不尽相同,由此可以为每个全

文索引列指定不同的语言。每种语言的断字符能够使得访问语言生成的词更为准

确。

l 标记:由断字符标识的词或字符串。

l 筛选器:用于从存储在varbinary(max)或image 列中的文件内提取指定的文本

类型的文本。当varbinary(max)或image 列中包含带有特定文件扩展名的文档时,

全文搜索会使用筛选器来解释二进制数据,筛选器会从文档中提取文本化信息并用

于建立索引。

l 填充(爬网):创建维护全文索引的过程叫填充,也叫爬网。

l 干扰词:经常出现,但又不是要搜索的词。为了精简全文索引,这些词通常会被

忽略。

1.3

全文索引的体系结构

SQL Server 的全文索引是由SQL Server FullText Search 服务来维护的,该服务可以在Windows 操作系统的【管理工具】à【服务】里找到,如图1.1 所示,在此可以启动、停止、暂停、恢复和重新启动该服务。只有SQL Server FullText Search 服务在启动状态时,才能使用全文索引。

图1.1 SQL Server FullText Search 服务

SQL Server FullText Search 服务由两个部分组件支持:一个是Microsoft Full-Text Eng

ine for SQL Server(MSFTESQL),也就是SQL Server 全文搜索引擎;另一个是Microsoft Full-Text Engine Filt er Deamon(MSFTEFD),也就是全文搜索引擎过滤器。

Microsoft Full-Text Engine for SQL Server 的作用是填充全文索引、管理全文索引和全

文目录、帮助对SQL Server 数据库中的数据表进行全文搜索。Microsoft Full-Text Engine F ilter Deamon 包含筛选器、协议处理程序和断字符三个组件,其作用是负责从数据表中访问

和筛选数据以及进行断字和词干分析。其中,筛选器的作用是从文档中提取文本信息,并将非文本信息和格式化信息(如换行符、字体大小等信息)删除,然后生成文本字符串和属性的对应,并将它们传递给索引引擎;协议处理程序用于从指定数据库中的表内访问数据;断字符用于在查询或抓取的文档中确定字符边界位置。

全文索引组件负责对全文索引的初始填充以及当全文索引表中的数据被修改时的更新。

当全文填充(爬网)开始后,数据库引擎会将大量的数据存储到内存里,并通知Microsoft Full-Text Engine for SQL Server(MSFTESQL)开始进行索引。当MSFTESQL 服务接到进

行索引的通知后,使用协议处理程序组件从内存中取得数据进行处理后生成全文索引。MSF TESQL 服务会将数据表中的某一列或几列中的字符和二进制数据编制成索引。在对varbina ry(max)或image 列中的数据编制索引时,筛选器会将基于为该数据指定的文件格式来提取文本。在处理索引的过程中MSFTESQL 服务通过断字符来将收集到的文本数据分隔成各个单独的标记或关键字。这个过程就是全文索引的过程。

由于全文索引与普通的索引不同,全文索引并不是存储在数据表中,而是存储在全文目

录中,所以在使用全文索引来搜索数据时,其运行的流程和普通索引也不一样。

如图1.2 所示,当SQL Server 发出全文搜索的请求后,会将搜索的条件传递给全文搜

索引擎过滤器,经过MSFTEFD 处理后,将数据提供给MSFTESQL,再由MSFTESQL 从全文目录中找到符合要求的数据,再返回给SQL Server 进行后续操作。这就是进行全文搜索的过程。

图1.2 全文搜索流程

1.4

全文目录管理

在前面章节里提到,全文目录的作用是存储全文索引,所以要创建全文索引必须先创建

全文目录。

1.4.1

创建全文目录

创建全文目录的方法如下:

(1)启动【SQL Server Management Studio】,连接到本地默认实例,在【对象资源

管理器】窗口里,选择本地数据库实例à【数据库】à【Northwind】à【存储】à【全文目录】。

(2)右击【全文目录】,在弹出的快捷菜单里选择【新建全文目录】选项。

(3)弹出如图1.3 所示的【新建全文目录】对话框,在该对话框的【全文目录名称】

文本框内可以输入全文目录的名称;在【目录位置】文本框内可以输入全文目录的存储路径,单击其后的【…】按钮可以选择路径,如果不输入的话,默认存储在?Program Files\Micros o

ft SQL Server\MSSQL.1\MSSQL\FTData?目录下;在【文件组】下拉列表框里可以选择全文

目录所属的文件组;在【所有者】文本框里可以输入全文目录的所有者;选中【设置为默认目录】复选框可以将此目录设置为全文目录的默认目录;【区分重音】单选框用于指明目录是否区分标注字符。

图1.3 【新建全文目录】对话框

(4)设置完毕后单击【确定】按钮完成操作。

1.4.2

查看与修改全文目录

全文目录添加完毕之后,可以在【对象资源管理器】窗口的【全文目录】树下看到新建

的全文目录。双击该全文目录,或右击该全文目录,在弹出的快捷菜单里选择【属性】选项,将会弹出如图1.4 所示【全文目录属性】对话框,在该对话框里可以查看全文目录的属性内容。

在【全文目录属性】对话框里有三个标签:【常规】选项卡里可以查看和修改全文目录

的设置;【表/视图】选项里可以查看和修改为全文目录分配的表和视图;【填充计划】选项项里可以添加或修改确定何时填充或重新填充全文目录的计划。

在如图1.4 所示的【全文目录属性】对话框里,可以看到全文目录所属的文件组、名

称、上次填充的时间、项计数、填充状态、目录大小、唯一键计数的内容,这些内容是不能修改的。可以修改项为:【默认目录】、【所有者】和【区分重音】三个选项内容。

图1.4 查看全文目录属性

在【目录】操作区域,有三个单选按钮,其中【无】表示不执行优化目录、重新生成目

录和重新填充目录操作;选择【优化目录】选项将会优化目录的空间利用率、提高搜索结果相关排名的准确性,从而提高查询性能;选择【重新生成目录】选项将会删除并重新生成全文目录,如果对全文目录的属性进行了更改,则必须执行该操作,例如在本对话框中修改了区分重音选择,则【目录】操作区域会自动变成灰色,系统自动重新生成全文目录;选择【重新填充目录】选项将会使用数据的最新更改来更新目录。修改完毕之后,单击【确定】按钮完成操作。

1.4.3

删除全文目录

当全文目录不再需要使用时,可以将其删除,删除方式如下:

(1)启动【SQL Server Management Studio】,连接到本地默认实例,在【对象资源

管理器】窗口里,选择本地数据库实例à【数据库】à【Northwind】à【存储】à【全文目录】。

(2)右击要删除的全文目录名,在弹出的快捷菜单里选择【删除】选项。

(3)在弹出的【对象删除】对话框中单击【确定】按钮完成操作。

如果要一次性删除多个全文目录,可以先在【对象资源管理器】窗口中定位到【全文目录】树,在【摘要】对话框里选择多个全文目录,然后单击鼠标右键,在弹出的快捷菜单里选择【删除】选项。在弹出的【对象删除】对话框中单击【确定】按钮完成操作。

1.5

全文索引管理

在创建完全文目录之后,可以动手创建全文索引了,下面将介绍如何创建、编辑和删除

全文索引。

1.5.1

创建全文索引的注意事项

在创建全文索引之前,先介绍创建全文索引要注意的事项:

l 全文索引是针对数据表的,只能对数据表创建全文索引,不能对数据库创建全文

索引。

l 在一个数据库中可以创建多个全文目录,每个全文目录都可以存储一个或多个全

文索引,但是每一个数据表只能够创建一个全文索引,一个全文索引中可以包含多

个字段。

l 要创建全文索引的数据表必须要有一个唯一的针对单列的非空索引,也就是说,

必须要有主键,或者是具备唯一性的非空索引,并且这个主键或具有唯一性的非空

索引只能是一个字段,不能是多字段的组合。

l 包含在全文索引里的字段只能是字符型的或image 型的字段。

1.5.2

创建全文索引

下面以Northwind 数据的?文章?表为例,介绍如何创建全文索引:

(1)启动【SQL Server Management Studio】,连接到本地默认实例,在【对象资源

管理器】窗口里,选择本地数据库实例à【数据库】à【Northwind】à【表】à【文章】。(2)右击【文章】数据表,在弹出的快捷菜单里选择【全文索引】à【定义全文索引】。(3)弹出如图1.5 所示【全文索引向导】对话框,此对话框中显示的是全文索引向导

的介绍,单击【下一步】按钮。

图1.5 【全文索引向导】对话框

(4)弹出如图1.6 所示的【选择索引】对话框,此时可以选择要创建全文索引的数据

表的唯一索引,使用该索引作为全文索引的唯一索引。在【唯一索引】下拉列表框里,列出该表中所有的唯一索引。在该对话框里选择唯一索引后,单击【下一步】按钮。

图1.6 【选择索引】对话框

(5)弹出如图1.7 所示【选择表列】对话框,此时可以选择要加入全文索引的字段。

在该对话框里可以选择一个或多个字段加入全文索引。SQL Server 2005 可以对存储在imag e 类型的字段中的文件进行全文搜索。image 类型的字段中可以存入各种文件,但是SQL S erver 2005 只支持Word、Excel、PowerPoint、网页和纯文本文件类型。如果要对image 类型的字段里的文件进行全文搜索,必须还要有一个字符串类型的字段用于指明存储在ima ge 字段中的文件的扩展名。如图1.7 中的文件字段,如果要对其创建全文索引,必须还要指定类型列。选择完毕后单击【下一步】按钮。

图1.7 【选择表列】对话框

(6)弹出【选择更改跟踪】对话框,在该对话框里可以定义全文索引的更新方式,一

共有三种更新方式:

l 【自动】:选中此单选按钮后,当基础数据发生更改时,全文索引将自动更新;

l 【手动】:如果不希望基础数据发生更改时自动更新全文索引,请选中此单选按

钮。对基础数据的更改将保留下来。不过,若要将更改应用到全文索引,必须手动

启动或安排此进程;

l 【不跟踪更改】:如果不希望使用基础数据的更改对全文索引进行更新,请选中

此单选按钮。

设置完毕后单击【下一步】按钮。

图1.8 【选择更改跟踪】对话框

(7)弹出如图1.9 所示的【选择目录】对话框,在此可以选择全文索引所存储的全文

目录。如果没有要选择的全文目录,也可以在此新建一个全文目录。创建全文目录的方法与

上节中所说的一样。选择完毕后单击【下一步】按钮。

图1.9 【选择目录】对话框

(8)弹出如图1.10 所示的【定义填充计划】对话框,在此可以创建全文索引和全文

目录的填充计划,也可以单击【下一步】,在创建完全文索引后再创建填充计划。

图1.10 【定义填充计划】对话框

(9)弹出如图1.11 所示的【全文索引向导说明】对话框,在该对话框里可以看到全

文索引要完成的工作说明,如果有不正确的设置,可以单击【上一步】按钮返回去重新设置,如果完全正确则单击【完成】按钮完成操作。

图1.11 【全文索引向导说明】对话框

1.5.3

查看与修改全文索引

在创建完全文索引之后,右击数据表,在弹出的快捷菜单里选择【全文索引】à【属性】可以查看全文索引的设置,如图1.12 所示。

图1.12 【全文索引属性】常规信息对话框

在图1.12 中可以看到全文索引的目前设置情况,在该对话框中可以修改是否启用全文

索引和全文索引的更改跟踪信息。单击【列】标签,打开如图1.13 所示的全文索引的列信息,在此可以修改全文索引所包含的列信息。

图1.13 【列】选项卡

1.5.4

启用和禁用全文索引

全文索引创建完毕之后,不会立即自动启用,所以需要手动启用全文索引。启动全文索引的方法如下:

(1)在【对象资源管理器】窗口里展开树形目录,定位到要启用全文索引的数据表。(2)右击要启用全文索引的数据表,在弹出的快捷菜单中选择【全文索引】à【启用全文索引】。

如果要禁用全文索引,也可以采取以下的方法来禁用全文索引:

(1)在【对象资源管理器】窗口里展开树形目录,定位到要启用全文索引的数据表。(2)右击要禁用全文索引的数据表,在弹出的快捷菜单中选择【全文索引】à【禁用全文索引】。

1.5.5

删除全文索引

当全文索引不再使用时,可以将其删除,删除方法如下:

(1)右击要删除全文索引的数据表,在弹出的快捷菜单里选择【全文索引】à【删除全文索引】。

(2)在弹出的【删除全文索引】对话框里单击【确定】按钮完成操作。

1.6

填充全文索引

填充全文索引实质上就是更新全文索引,其目的是让全文索引可能够反映最新的数据表

内容。

1.6.1

填充全文索引的方式

填充全文索引一共有三种方式:

l 完全填充:完全填充方式通常发生在首次填充全文目录或全文索引时,在前一节

中所说到的?启用全文索引?时,就已经对全文索引进行了一次完全填充,以后就可

以使用基于更改跟踪的填充和基于增量时间戳的填充来维护全文索引。

l 基于更改跟踪方式的填充:SQL Server 会记录设置了全文索引的数据表中修改

的行,这些记录存储在日志中,在某个适当时机时将这些更改填入到全文索引中。

l 基于增量时间戳方式的填充:也就是增量填充,在全文索引中更新上次填充之后

更新的行。增量填充要求索引表中必须有timestamp 数据类型的字段,如果没有

该类型的字段,则无法执行增量填充,系统将会以完全填充的方式来取代增量填充

方式进行填充。

1.6.2

填充全文索引

由于填充全文索引有三种不同的方式,所以填充全文索引的方法也不相同。如果要以完

全填充或增量填充方式来填充全文索引,则只要右击全文索引所在的数据表,在弹出的快捷菜单里选择【全文索引】à【启动完全填充】或【启动增量填充】选项即可。如图1.1 所示。

图1.14 填充全文索引

更改跟踪方式填充全文索引分为手动和自动两种方法,在默认情况下是自动填充,如果

要更改为手动方式,可以右击全文索引所在的数据表,在弹出的快捷菜单里选择【全文索引】à【手动跟踪更改】选项,如图1.1 所示。

选择完毕之后,SQL Server 会自动跟踪数据表中的数据更改情况,但并不将其更新到

全文索引中,只有在需要将这些更新反应到全文索引上时,右击全文索引所在的数据表,在弹出的快捷菜单里选择【全文索引】à【应用跟踪的更改】选项后,才会将更新反应到全文索引上。

如果在图1.1 所示界面里选择了【自动跟踪更改】选项,则由SQL Server 自动将记

录的数据表的更改更新到全文索引中,不再需要人工进行填充。

如果在数据库中有多个数据表创建了全文索引,可以使用重新生成索引目录的方法将所

有的全文索引进行完全填充,其方法如下:

(1)在【对象资源管理器】窗口里展开树形目录,定位到【服务器】à【数据库】à【Northwind】à【存储】à【全文目录】。

(2)右击【全文目录】,在弹出的快捷菜单中选择【全部重新生成】选项。

(3)在弹出的【重新生成所有全文目录】对话框里单击【确定】按钮完成操作。

1.6.3

定时填充全文索引

在SQL Server 2005 中,可以为填充全文索引设置计划,让系统自动定时填充全文索引,其方法如下:

(1)右击全文索引所在的数据表,在弹出的快捷菜单里选择【全文索引】à【属性】

来查看全文索引的设置,如图1.12 所示,在该图中选择【计划】选项。

(2)弹出如图1.15 所示全文索引填充计划对话框,在该对话框中单击【新建】按钮。

图1.15 全文索引填充计划对话框

(3)弹出如图1.16 所示的【新建全文索引表计划】对话框。

l 在【名称】文本框里可以输入该计划名称。

l 在【计划类型】下拉列表框里,可选项有?SQL Server 代理启动时自动启动?:也就是在S

QL Server 代理启动时自动填充全文索引;?CPU 空闲时启动?:也就是当CPU 空闲时填充全

文索引;?执行一次?:在指定时间时填充全文索引,只填充一次;?重复执行?:可以设定多

次填充全文索引的方式。

l 如果选中【已启用】复选框,则启用该填充全文索引的计划。

l 在【执行一次】区域里,可以设置计划类型为?执行一次?的执行时间,在到达该时间时,自动填充全文索引。

l 在【频率】区域里,可以设置计划类型为?重复执行?的执行频率。在【执行】下拉列表框

里可选择项为?每天?、?每周?和?每月?,分别用于指定每天、每周和每月执行填充计划的频

率。

l 在【持续时间】区域里可以设置该计划的开始日期与结束日期,其中结束日期可以设置为无结束日期,也就是永远执行下去。

图1.16 【新建全文索引表计划】对话框

(4)设置完毕后单击【确定】按钮完成计划设计,返回如图1.17 所示对话框。

图1.17 全文索引填充计划对话框

(5)在如图1.17 所示对话框里,可以选择全文索引填充计划所要执行的填充方式,

设置完毕后单击【确定】按钮完成操作。

注意:如果单击【确定】按钮之后出现如图1.18 所示的失败对话框,请先安装SQL

Server 2005 SP1(下载地址为:https://www.doczj.com/doc/cc14657233.html,/downloads/details.aspx?displa ylang=zh-cn&

Family ID=cb6c71ea-d649-47ff-9176-e7cac58fd4bc),然后再安装版本为9.0.2153 的SQL Server 2005 累积修补程序包(下载地址为:https://www.doczj.com/doc/cc14657233.html,/kb/918222/zh-c n)。

图1.18 添加计划失败对话框

使用类似的方法也可以定时填充全文目录:

(1)右击全文目录名,在弹出的快捷菜单里选择【属性】选项。

(2)在弹出的如图1.4 所示的【全文目录属性】对话框里选择【填充计划】选项。

(3)弹出与1-15 所示的填充计划对话框,其添加计划的步骤与创建全文索引的填充

计划几乎相同,在此就不再赘述了。

1.7

使用全文搜索查询

设置完全文索引并填充完毕之后,就可以通过全文搜索来查询数据了。使用全文搜索来

查询数据所用到的T-SQL 语句也是SELECT 语句,只是在设置查询条件时和前面所说过的S ELECT 语句的查询条件设置有些不同。在T-SQL 语言中,可以在SELECT 语句的WHERE 子句里设置全文搜索的查询条件,也可以在FROM 子句里设置查询条件,此时将返回结果作为FROM 子句中的表格来使用。

如果要在WHERE 子句里设置全文搜索的查询条件,可以使用CONTAINS 和FREETEXT

两个谓词;如果要在FROM 子句里设置全文搜索的查询条件,可以使用CONTAINSTABLE 和FREETEXTTABLE 两个行集值函数。

1.7.1

使用CONTAINS

搜索

CONTAINS 用于SELECT 语句的WHERE 子句中,可以支持使用复杂的语法在字符列中

搜索词、子句、衍生字或位置相近的字符串。使用CONTAINS 谓词可以在数据表中使用以下五种形式搜索数据:

l 简单词:也就是可以搜索一个或多个特定的词或短语。词可以包括一个或多个字

符,中间没有空格或标点。短语可以是由空格分隔的多个词组成,但词之间可以有

标点也可以没标点。

l 派生词:也就是可以搜索特定词的变形,一般是指英语中的单词,其有过去式、

现在式、将来式等不同的形式。派生词是指可以包含该单词的所有其他形式。

l 前缀词:也就是可以搜索指定文本开头的词或短语。一般也用于英文单词中,可

以指定一个英文单词的前几个字母来作为搜索条件。

l 加权词:也就是可以给多个搜索条件加上权值,加权值越高的记录排在越前面。

l 邻近词:也就是可以搜索与另一个词或短语相邻近的词或短语。

下面分别介绍如何使用这些不同的方式来搜索数据。

1.7.1.1 CONTAINS 的语法

CONTAINS 的语法代码如下:

CONTAINS

( { column_name | (column_list) | * } --列名

, '< contains_search_condition >' --搜索语

[ , LANGUAGE language_term ] --发出查询时所用

的语言

)

< contains_search_condition > ::=

{ < simple_term > --简单词搜索方式

| < prefix_term > --前缀词搜索方式

| < generation_term > --派生词搜索方式

| < proximity_term > --邻近词搜索方式

| < weighted_term > --权重词搜索方式

}

| { ( < contains_search_condition > ) --搜索语句

[ { AND | & | AND NOT | & ! | OR | | } ] --条件

< contains_search_condition > [ ...n ] --搜索语句

}

< simple_term > ::= --简单词搜索方式语法块

word | " phrase "

< prefix term > ::= --前缀词搜索方式语法块

{ "word * " | "phrase *" }

< generation_term > ::= --派生词搜索方式语法块

FORMSOF (

{ INFLECTIONAL --指定词干分析器

| THESAURUS } , --指定同义词库

< simple_term > [ ,...n ] )

< proximity_term > ::= --邻近词搜索方式语法块

{ < simple_term > | < prefix_term > }

{ { NEAR | ~ }

{ < simple_term > | < prefix_term > }

} [ ...n ]

< weighted_term > ::= --权重词搜索方式语法块

ISABOUT

( { {

< simple_term >

| < prefix_term >

| < generation_term >

| < proximity_term >

}

[ WEIGHT ( weight_value ) ] --指定权重

} [ ,...n ]

)

其中常用的参数为:

l column_name:字段名

l column_list:字段名列表

l *:所有字段

l LANGUAGE language_term:用于设置查询时所用的语言。例如在image 字段

里可能会存储了多种语言的文档,该参数允许用户指定搜索使用的语言,从而提高匹配率。

l INFLECTIONAL :用于指定使用与语言相关的词干分析器。词干分析器用于根据

每种具体语言的判断词干。

l THESAURUS:用于指定同义词库。

1.7.1.2 简单词的搜索方式

简单词的搜索方式就是搜索一个或多个特定的词或短语。

例一、搜索文章表的标题中含有?上海?的记录,其代码如下:

SELECT * FROM 文章

WHERE CONTAINS(标题,'上海')

例二、搜索文章表的内容中含有?上海?或?广州?的记录,其代码如下:

SELECT * FROM 文章

WHERE CONTAINS(内容,' "上海" OR "广州"')

注意例二与例一的不同,在CONTAINS 谓词的第二个参数里,将??上海?OR ?广州??做

为一个字符串传递给CONTAINS。使用以下代码将会出错:

SELECT * FROM 文章

WHERE CONTAINS(内容,' 上海‘OR ’广州')

1.7.1.3 派生词的搜索方式

派生词的搜索方式主要用在英文当中,因为英文单词中含有现在式、过去式、将来式、

单复数等不同的形式,使派生词的搜索方式可以将字段中包括该单词的所有形式的记录都搜索出来。例如使用派生词方式搜索包含单词download 的记录,则会把包含download、dow nloading 等派生词的记录都搜索出来。

例三、搜索文章表中内容中含有download 及其派生词的记录,其代码如下:

SELECT * FROM 文章

WHERE CONTAINS(内容,'FORMSOF(INFLEC TIONAL,download)')

注意CONTAINS 谓词的不同处,运行结果如图1.19 所示。

图1.19 运行结果

在图1.19 中可以看到只查询到一条记录,而并未将download 的派生词也搜索进来,

这是因为从一开始设置全文索引时,所采用的是数据库默认的断字符语言,即简体中文,而在中文中没有派生词,所以使用派生词方式搜索数据是起不到其作用的。此时可以通过修改全文索引的断字符语言来达到搜索效果。修改方式如下:

(1)右击全文索引所在的数据表,在弹出的快捷菜单中选择【全文索引】à【属性】

弹出如图1.12 所示【全文索引属性】对话框。

(2)在【全文索引属性】对话框里选择【列】选项,弹出如图1.20 所示对话框,修

改【内容】字段的【断字符语言】为?English?。

图1.20 修改断字符语言

(3)单击【确定】按钮完成操作。

再次运行例三中的代码,其运行结果如图1.21 所示。

图1.21 正确的运行结果

1.7.1.4 前缀词的搜索方式

前缀词的搜索方式主要也是用在搜索英文中,例如搜索以?do?开头的单词,则可以将d octor、document、download 等单词都搜索出来。

例四、搜索文章表中内容中含有?do?开头的单词的记录,其代码如下:

SELECT * FROM 文章

WHERE CONTAINS(内容,' "do*" ')

此方式有点类似与lik e 子句的通配符方式,但只能使用?*?,并且只能放在英文字母之后,如?*do?、?*do*?都是错误的表达方式。

1.7.1.5 加权词的搜索方式

当以多个字符串作为搜索条件搜索记录时,可以为不同的字符串加上一个加权值,这个

加权值是介于0 和1 之间的数值,加权值越高的记录排在越前面。

例五、搜索文章表中内容中含有?download?、?上海?、?山西?的记录,并为不同的条件

加上加权值,其代码如下:

SELECT * FROM 文章

WHERE CONTAINS(内容,

'ISABOUT ("download" weight(0.9),

"上海" weight(0.6),

"山西" weight(0.5))')

SELECT * FROM 文章

WHERE CONTAINS(内容,

'ISABOUT (download weight(0.9),

上海weight(0.6),

山西weight(0.5))')

事实上在该SELECT 语句的返回结果集里,并没有按加权值的大小来排序,因为WEIG

HT 不影响CONTAINS 查询的结果,只会影响CONTAINSTABLE 查询中的排序。

说明:使用本例时最好将?内容?字段的?断字符语言?改回简体中文,否则会影响中文的搜索结果。

1.7.1.6 邻近词的搜索方式

邻近词的搜索方式可以搜索记录中位置相近的两个字符,例如要搜索文章标题为?教育

部拟取消教师资格终身制实行定期认证?的文章,完整的标题名记不清楚了,只记得?教育部?

和?资格?,则可以以邻近词的搜索方式进行查询。

例六、搜索文章内容中与教育部表示相关的记录,其代码如下:

SELECT * FROM 文章

WHERE CONTAINS(内容,' "教育部" NEAR "表示"')

1.7.2

使用FREETEXT

搜索

FREETEXT 搜索方式与CONTAINS 搜索方式相比,其搜索结果表现都十分不精确,因

为FREETEXT 的搜索方式是将一个句子中的每个单字拆分开进行搜索的。例如:如果使用C ONTAINS 搜索方式搜索条件为?教育部?的记录,那么搜索出来的将是记录里包含?教育部?

三个字符串的记录。如果使用FREETEXT 搜索方式搜索条件为?教育部?的记录,那么搜索出

来的将是记录里包含?教?或?育?或?部?的记录。如果搜索的是英文字符串?SQL Server 200

5?,则拆分为?SQL?、?Server?和?2005?来进行搜索,只要满足其中一个条件都算搜索成功。

FREETEXT 的语法代码为:

FREETEXT ( { column_name | (column_list) | * }

, 'freetext_string' [ , LANGUAGE language_term ] )

其中:

l column_name:为字段名。

使用Oracle全文索引搜索文本

使用Oracle全文索引搜索文本 不使用Oracle text功能,也有很多方法可以在Oracle数据库中搜索文本.可以使用标准的INSTR 函数和LIKE操作符实现。 SELECT *FROM mytext WHERE INSTR (thetext, 'Oracle') > 0; SELECT * FROM mytext WHERE thetext LIKE '%Oracle%'; 有很多时候,使用instr和like是很理想的, 特别是搜索仅跨越很小的表的时候.然而通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限,因此对海量的文本数据进行搜索时,建议使用oralce提供的全文检索功能建立全文检索的步骤步骤一检查和设置数据库角色首先检查数据库中是否有CTXSYS用户和CTXAPP脚色。如果没有这个用户和角色,意味着你的数据库创建时未安装intermedia功能。你必须修改数据库以安装这项功能。默认安装情况下,ctxsys用户是被锁定的,因此要先启用ctxsys 的用户。步骤二赋权在ctxsys用户下把ctx_ddl的执行权限赋于要使用全文索引的用户,例: grant execute on ctx_ddl to pomoho; 步骤三设置词法分析器(lexer) Oracle实现全文检索,其机制其实很简单。即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为term)找出来,记录在一组以dr$开头的表中,同时记下该term 出现的位置、次数、hash 值等信息。检索时,Oracle 从这组表中查找相应的term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。Oracle 针对不同的语言提供了不同的lexer, 而我们通常能用到其中的三个: n basic_lexer: 针对英语。它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如if , is 等,具有较高的处理效率。但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句话作为一个term,事实上失去检索能力。以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。此时若检索‘中国’,将检索不到内容。 n chinese_vgram_lexer: 专门的汉语分析器,支持所有汉字字符集(ZHS16CGB231280 ZHS16GBK ZHT32EUC ZHT16BIG5 ZHT32TRIS ZHT16MSWIN950 ZHT16HKSCS UTF8 )。该分析器按字为单元来分析汉语句子。‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。 n chinese_lexer: 这是一个新的汉语分析器,只支持utf8字符集。上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种term是没有意义的,反而影响效率。chinese_lexer的最大改进就是该分析器能认识大部分常用汉语词汇,因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大提高了效率。但是它只支持utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer. 如果不做任何设置,Oracle 缺省使用basic_lexer这个分析器。要指定使用哪一个lexer, 可以这样操作: 第一.当前用户下下建立一个preference(例:在pomoho用户下执行以下语句) exec ctx_ddl.create_preference ('my_lexer', 'chinese_vgram_lexer');

SQL Server 全文索引查询

SQL Server 全文索引查询T-SQL学习笔记之一(Full-text index) 2009-12-11 11:29 引言 这段时间为了提高海量字符串数据的查询效率,我对字段添加了全文索引。首先全文索引相对于传统的索引是有区别的,这是因为传统的索引主要是以首字母开始建立的索引,处理like 'keword%'这样的查询会很高效,但是如果查询时不限定首字母,而只是包含某个词,比如like '%keyword%'这样的查询,实际操作中无法使用传统索引加速查询效率,而只能一项一项比较了。 而全文索引正是提供了“包含”式查询机制,查询一个长字符串中是否包含给定关键词的功能,这无论是在搜索引擎或是网站的搜索平台都是很有用处的。 首先,推荐一本学习SQL Server全文索引的书籍,这本书详细的讲解了全文索引的方方面面,甚至还阐述许多设计搜索引擎的思想和方法。书名是《Pro Full-Text Search in SQL Server 2008》,是Apress出版的。 这本书的内容是按章划分的,同时由浅入深,从一般的技巧到高级的技巧。我这里就简单分享一下基本的全文查询方法,更多高级的技巧应该在实际应用中按需进行学习。 要实现全文查询,首先安装的SQL Server实例要支持全文查询服务,可以查看windows服务是否有全文索引服务。如果没有,则要重新安装SQL Server并选择添加功能,将Full-Text功能选中,然后再安装或升级。

有了全文查询服务,还不能直接进行查询,需要先在想要建立全文索引的字段上建立一个全文索引。方法是打开企业管理器,选择字段所在表格,然后点击右键,选择"Full-text inde”,然后选择"define Full-text index"就能进入设置面板。 需要注意的是,全文索引只能建立在Unique(唯一)字段上,并且每个表最多只能有一个全文索引字段,因此要慎重。然后按照提示建立全文索引即可(可以参见我推荐的那本书,会有一步一步操作的详细说明和注释) 建立好全文索引后,就能够运用T-SQL的全文查询语法进行全文查询了。 主要有两个语法,一个是contains,另一个是freetext Contains contains从字面上就能很好理解,即包含,比如我们在表Sample的一个字段Column里查询包含“世界末日”这个关键词的所有记录,该表一共有60万条记录,传统的查询语法是 select * from Sample where [Column] like '%世界末日%'

浅谈MySQL索引分析和优化

MySQL索引分析和优化列:

由于索引文件以B-树格式保存,MySQL能够立即转到合适的firstname,然后再转到合适的lastname,最后转到合适的age。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录! 那么,如果在firstname、lastname、age这三个列上分别创建单列索引,效果是否和创建一个firstname、lastname、age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。

下面我们就来看看这个EXPLAIN分析结果的含义。 table:这是表的名字。 type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明: “对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一种好的连接类型。” 在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。 如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。 possible_keys: 可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是“firstname”)。默认索引名字的含义往往不是很明显。 Key:它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。 key_len:索引中被使用部分的长度,以字节计。在本例中,key_len是102,其中firstname 占50字节,lastname占50字节,age占2字节。如果MySQL只使用索引中的firstname部分,则key_len将是50。 ref:它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。 rows:MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。 Extra:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。在本例中,MySQL 只是提醒我们它将用WHERE子句限制搜索结果集。 索引的缺点 到目前为止,我们讨论的都是索引的优点。事实上,索引也是有缺点的。 首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。 第二,对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。 【结束语】在大型数据库中,索引是提高速度的一个关键因素。不管表的结构是多么简单,一次500000行的表扫描操作无论如何不会快。如果你的网站上也有这种大规模的表,那么你确实应该花些时间去分析可以采用哪些索引,并考虑是否可以改写查询以优化应用。要了解更多信息,请参见MySQL manual。另外注意,本文假定你所使用的MySQL是3.23版,部分查询不能在3.22版MySQL上执行。

SQL Server 2008 中全文搜索步骤

/*建立测试环境*/ if object_id('tb')isnotnull droptable tb go createtable tb (id intidentity(1,1), title varchar(200), detail varchar(1000), constraint pk_id primarykey(id)--在建立全文索引时需要使用 ) insertinto tb select'火箭即将签下新秀射手','据悉,巴丁格与火箭队的合同谈判是于昨天完成的,巴丁格将得到与泰勒一样的合同。此前媒体曝光泰勒的合同为期四年,总价值万美元,其中前两年为保障性合同。巴丁格预计会在接下来几天内正式宣布签约加盟火箭。' union all select'韦弗被曝已与希腊豪门签约','据国际篮球网报道,前火箭队球员范-韦弗已经与希腊豪门奥林匹亚科斯队签订了合同。韦弗得到一份为期两年,总价值万美元的合同。' union all select'马刺豪掷千金为对抗湖人','马刺队在今夏休赛期补充了几员大将,主教练格雷格-波波维奇日前在接受Yahoo!体育采访时透露,马刺队不惜缴纳奢侈税构建豪华阵容就是为了对抗湖人队,争取拿到第五个总冠军。' union all select'华莱士未曾想过离开汽车城','此前本-华莱士已经同意重返底特律活塞,并且以老将底薪和活塞签下一份年万美元的合同,而据《每日先驱报》专栏作家米克-麦格劳透露,这位当年叱咤NBA赛场的内线防守悍将甚至从来就没有考虑过要离开活塞队。' union all

select'米勒竟好横刀夺爱追求人妻','对于那些没看过雷吉·米勒在步行者创造“米勒时间” 的“后”们,应该怎么介绍这位前NBA球星呢?难道从前天洛杉矶马里布海滩上空那架飞机拉的横幅说起?恐怕没有哪位家长愿意这么做。' union all select'姚明:没把上海当投资项目乐得生意做了好人当了','“姚蜜”说:不缺广告效应的姚明收购濒临绝境的上海东方篮球俱乐部,说明他是真的想为曾经的母队做点事情。' union all select'火箭不敌奇才终结年纪录','此役姚麦组合状态糟糕,姚明投中得到分个篮板次盖帽,麦迪投中拿下分个篮板次助攻,两人联手竟不如得到分个篮板次助攻次盖帽的贾米森。' --- --第一步启用数据库的全文索引 sp_fulltext_database enable--启用数据库的全文索引 go --第二步:建立全文目录 createfulltextcatalog tb_fulltext in path N'D:/Program Files/Microsoft SQL Server2005/MSSQL.1/MSSQL/FTData' withaccent_sensitivity=on--区分重音 authorization dbo;--全文目录的所有者 --第三步:建立全文索引 createfulltextindexon tb (title,detail) keyindex pk_id--指定索引列,为了提高性能,最好使用聚集索引 on tb_fulltext withchange_trackingauto--在关联的表中修改了数据时,自动更新全文索引。 --第四步:查询示例:

一种基于Lucene的中文全文检索系统

—94— 一种基于Lucene 的中文全文检索系统 苏潭英1,郭宪勇2,金 鑫3 (1. 解放军信息工程大学电子技术学院,郑州 450004;2. 北京飞燕技术公司,北京 100072;3. 解放军通信指挥学院,武汉 430010)摘 要:在开源全文索引引擎Lucene 的基础上,设计了一个中文全文检索系统模型,该模型系统由7个模块组成,索引模块、检索模块是其中的核心部分。论述了模型的整体结构,分析设计了索引及检索模块,通过具体的索引技术和检索技术来提高整个系统的检索效率。该系统增加了加密模块,实现对建立的全文索引进行加密处理,增强了信息的安全性。 关键词:全文检索;Lucene ;倒排索引 Chinese Full-text Retrieval System Based on Lucene SU Tan-ying 1, GUO Xian-yong 2, JIN Xin 3 (1. Institute of Electronic Technology, PLA Information Engineering University, Zhengzhou 450004; 2. Technology Company of Beijing Feiyan, Beijing 100072; 3. Institute of PLA Communication Command, Wuhan 430010) 【Abstract 】This paper proposes a model of Chinese full-text retrieval system based on Lucene which is an open source full-text retrieval engine,and expatiates its frame. This model is composed of seven modules, among which the index module and the search module are the core parts. It designs them concretely, and improves the search efficiency of the full-text retrieval system with index technology and search technology. The system model concludes an encryption module to encrypt the index and increases the system security. 【Key words 】full-text retrieval; Lucene; inverse index 计 算 机 工 程Computer Engineering 第33卷 第23期 Vol.33 No.23 2007年12月 December 2007 ·软件技术与数据库· 文章编号:1000—3428(2007)23—0094—03 文献标识码:A 中图分类号:TP391 1 中文全文检索系统 全文检索技术是一个最普遍的信息查询应用,人们每天在网上使用Google 、百度等搜索引擎查找自己所需的信息,这些搜索引擎的核心技术之一就是全文检索。随着文档处理电子化、无纸化的发展,图书馆、新闻出版、企业甚至个人的电子数据激增,如何建立数据库、管理好自己的数据,是亟待解决的问题,而全文检索是其中一个非常实用的功能。全文检索产品实际上是一个内嵌该项技术的数据库产品[1]。 西文的全文检索已有许多成熟的理论与方法,其中,开放源代码的全文检索引擎Lucene 是Apache 软件基金会Jakarta 项目组的一个子项目,它的目的是为软件开发人员提供一个简单易用的工具包,方便在目标系统中实现全文检索的功能。很多项目使用了Lucene 作为其后台的全文索引引擎,比较著名的有: (1)Jive :Web 论坛系统; (2)Cocoon :基于XML 的Web 发布框架,全文检索部分使用了Lucene ; (3)Eclipse :基于Java 的开放开发平台,帮助部分的全文索引使用了Lucene 。 Lucene 不支持中文,但可以通过扩充它的语言分析器实现对中文的检索。本文在深入学习研究Lucene 的前提下,设计了一个中文的全文检索系统,对其核心的索引模块和检索模块进行了阐释,并添加了加密模块对索引信息加密,增强了系统的安全性。 2 系统的总体结构 本模型总体上采用了Lucene 的架构。Lucene 的体系结构如表1所示,它的源代码程序由7个模块组成。 表1 Lucene 的组成结构 模块名 功能 org.apache.Lucene.search 搜索入口 org.apache.Lucene.index 索引入口 org.apache.Lucene.analysis 语言分析器 org.apache.Lucene.queryParser 查询分析器 org.apache.Lucene.document 存储结构 org.apache.Lucene.store 底层IO/存储结构 org.apache.Lucene.util 一些公用的数据结构 本文通过扩充Lucene 系统来完成中文的全文检索系统,Lucene 包含了大量的抽象类、接口、文档类型等,需要根据具体应用来定义实现,本文对其作了如下扩充修改: (1)按照中文的词法结构来构建相应的语言分析器。Lucene 的语言分析器提供了抽象的接口,因此,语言分析(analyser)是可以定制的。Lucene 缺省提供了2个比较通用的分析器SimpleAnalyser 和StandardAnalyser ,但这2个分析器缺省都不支持中文,因此,要加入对中文语言的切分规则,需要对其进行修改。 (2)按照被索引的文件的格式对不同类型的文档进行解析,进而建立全文索引。例如HTML 文件,通常需要把其中的内容分类加入索引,这就需要从org.apache.lucene.子document 中定义的类Document 继承,定义自己的HTMLDocument 类,然后将之交给org. apache.lucene.index 模块写入索引文件。Lucene 没有规定数据源的格式,只提供 作者简介:苏潭英(1981-),女,硕士研究生,主研方向:数据库全文检索;郭宪勇,高级工程师;金 鑫,硕士研究生 收稿日期:2007-01-10 E-mail :sutanyingwendy@https://www.doczj.com/doc/cc14657233.html,

全文检索功能

在应用中加入全文检索功能 ——基于java的全文索引引擎lucene简介 作者:车东 email: https://www.doczj.com/doc/cc14657233.html,/https://www.doczj.com/doc/cc14657233.html, 写于:2002/08 最后更新: 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 https://www.doczj.com/doc/cc14657233.html,/tech/lucene.html 关键词:lucene java full-text search engine chinese word segment 内容摘要: lucene是一个基于java的全文索引工具包。 1.基于java的全文索引引擎lucene简介:关于作者和lucene的历史 2.全文检索的实现:luene全文索引和数据库索引的比较 3.中文切分词机制简介:基于词库和自动切分词算法的比较 4.具体的安装和使用简介:系统结构介绍和演示 5.hacking lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 6.从lucene我们还可以学到什么 基于java的全文索引/检索引擎——lucene lucene不是一个完整的全文索引应用,而是是一个用java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 lucene的作者:lucene的贡献者doug cutting是一位资深全文索引/检索专家,曾经是v-twin搜索引擎(apple的copland操作系统的成就之一)的主要开发者,后在excite担任高级系统架构设计师,目前从事于一些internet底层架构的研究。他贡献出的lucene的目标是为各种中小型应用程序加入全文检索功能。 lucene的发展历程:早先发布在作者自己的https://www.doczj.com/doc/cc14657233.html,,后来发布在sourceforge,2001年年底成为apache基金会jakarta的一个子项目:https://www.doczj.com/doc/cc14657233.html,/lucene/ 已经有很多java项目都使用了lucene作为其后台的全文索引引擎,比较著名的有: ?jive:web论坛系统; ?eyebrows:邮件列表html归档/浏览/查询系统,本文的主要参考文档“thelucene search engine: powerful, flexible, and free”作者就是eyebrows系统的主要开发者之一,而eyebrows已 经成为目前apache项目的主要邮件列表归档系统。 ?cocoon:基于xml的web发布框架,全文检索部分使用了lucene ?eclipse:基于java的开放开发平台,帮助部分的全文索引使用了lucene

法规标准库及全文检索系统

法规标准库及全文检索系统 一、产品研发背景 为了使电力企业相关人员更方便的查询到国家、行业发布的各种法律、法规及行业标准,避免企业自己搜索各种文件时,不能保证文件信息、版本的正确性和及时性,提高工作效率。开发法规标准库及全文检索系统。 二、产品特点 内容齐全 由中电方大上传和管理软件数据库中文件,上传文件包括电力行业的法律、法规、行业标准和各企业集团规定,还包含一些对这些法律、法规解读的文章或论文,对法律、法规进行更深层次的挖掘理解。企业在生产、培训时使用该软件可以更方便的查询到需要的文件。 文件实时更新 系统中的文件由中电方大进行管理,对每一个文件的过期或作废等,中电方大都保持实时更新,保持系统的与时俱进,保证文件为实时适用的最新版本。 文件查询方便 文件的查询搜索功能,即能输入文件名或关键字在数据库中全部搜索,又能按照法律、法规、标准或是生效年份等不同条件进行查询搜索。 全文所搜功能 此功能是系统的一大亮点。为了便于查询文件及对应文件内容的搜索,系统支持全文搜索功能。如在搜索界面输入“压力容器”,在结果列表中即会显示相关文件的名称,也会显示部分带有关键字的内容。

三、产品功能 系统支持相关法律法规的全面搜索及预览功能。 四、产品解决问题 系统解决了企业在需要获取相关法规文件时不能确定文件的准确性、最新性等问题。 五、提供的产品服务 ◆提供本产品终身更新服务 ◆提供功能个性化开发服务 六、产品适用范围 产品适用于各类企业 七、公司简介 北京中电方大科技股份有限公司,成立于2004年,新三板挂牌上市公司(证券代码430411,简称:中电方大)。 本公司是处于软件和信息技术服务业的安全与应急服务提供商,为电力企业用户提供安全与应急管理及信息化及对应的整体解决方案。公司于2012年获得国家电监会(现国家能源局)颁发的电力安全生产标准化一级评审机构资质,从事发电企业、电力建设企业的安全生产标准化评审业务。于2014年获得国家能源局指定的电力安全培训机构资质,为发电企业、电网企业相关负责人和安全生

SQLserver2008全文检索使用方法

SQLserver2008全文检索使用方法 1.开启SQL Full-text服务 图1 开启SQLServer Full-text服务 保证SQL Full-text Filter Daemon Launcher服务处于开启状态,不同版本SQLServer全文检索服务名称可能稍有不同,如果服务列表中没有这个服务,请使用SQLServer安装光盘安装“全文检索”组件。 2.启用全文检索 执行SQL语句启用全文检索: Execute sp_fulltext_database 'enable'

3.设置全文语言为中文 图2 设置全文语言 在服务器->属性->高级中,设置默认全文语言为2052(中文)。 4.建立数据表 在需要全文检索的数据表中,必须有一列字符型的字段存放文件类型,例如建表语句中的FileType。必须有一列Varbinary(Max)类型的字段存放文件内容,例如建表语句中的FileContent。 建表SQL语句示例: CREATE TABLE SampleBlobTable ( [PKID]int identity(1,1)primary key, [FileName]Nvarchar(255)null, [FileType]Nvarchar(32)null, [FileContent]VARBINARY(MAX)NULL,

[AddTime]datetime default(getdate()) ) 5.建立全文索引 步骤1 建立全文索引 在需要全文检索的数据表上点击右键->全文索引->定义全文索引。

步骤2 选择唯一索引 步骤3 选择表列

基于Java的全文索引引擎

在应用中加入全文检索功能 ——基于Java的全文索引引擎Lucene简介 作者:车东 Email: https://www.doczj.com/doc/cc14657233.html,/https://www.doczj.com/doc/cc14657233.html, 写于:2002/08 最后更新:09/09/2006 17:09:05 Feed Back >> (Read this before you ask question) 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 https://www.doczj.com/doc/cc14657233.html,/tech/lucene.html 关键词:Lucene java full-text search engine Chinese word segment 内容摘要: Lucene是一个基于Java的全文索引工具包。 1.基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 2.全文检索的实现:Luene全文索引和数据库索引的比较 3.中文切分词机制简介:基于词库和自动切分词算法的比较 4.具体的安装和使用简介:系统结构介绍和演示 5.Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用 接口的扩展 6.从Lucene我们还可以学到什么 基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。 Lucene的发展历程:早先发布在作者自己的https://www.doczj.com/doc/cc14657233.html,,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:https://www.doczj.com/doc/cc14657233.html,/lucene/ 已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有: Jive:WEB论坛系统;

数据库中全文搜索与Like的差别

数据库中全文搜索与Like的差别 在SQL Server中,Like关键字可以实现模糊查询,即确定特定字符串是否与制定模式相匹配。这里的模式可以指包含常规字符和通配符。在模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。不过通过使用通配符可以改变这个规则,如使用?等通配符可以与字符串的任意部分相匹配。故Like关键字可以在数据库中实现模糊查询。 另外数据库库管理员也可以利用全文搜索功能对SQL Server数据表进行查询。在可以对给定的标进行全文查询之前,数据库管理元必须对这个数据表建立全文索引。全文索引也可以实现类似Like的模糊查询功能。如在一张人才简历表中查找符合特定字符串的信息等等。虽然说Like关键字与全文搜索在功能上大同小异,但是在实现细节上有比较大的差异。作为数据库管理员需要了解这个差异,并选择合适的实现模式。 一、查询效率上的差异。 通常情况下,Like关键字的查询效率还是比较快的。特别是对于结构化的数据,Like的查询效率、灵活性方面是值得称道的。但是对于一些非机构化的文本数据,如果通过Like 关键字来进行模糊查询的话,则其执行效率并不是很理想。特别是对于全文查询来说,其速度要慢得多。而且随着记录数量的增多,类似的差异更明显。如在一张表中,有三百万行左右的文本数据,此时如果利用Like关键字来查找相关的内容,则可能需要几分钟的时间才能够返回正确的结果。相反,对于同样的数据通过采用全文搜索功能的话,则可能只需要1分钟不到甚至更多的时间及可以返回结果。故当文本数据的行数比较多时,如在一万行以上,则此时数据库管理员若采用全文搜索功能的话,则可以比较明显的改善数据库的查询效率。 二、对空格字符的敏感性。 在数据库中如果采用Like关键字进行模糊查询,则在这个关键字后面的所有字符都有意义。如现在用户使用like “abcd ”(带有两个空格)查询时,则后面的空格字符对于Like 关键字也是敏感的。也就是说,如果用户利用上面这条语句进行查询时,则被查询的内容必须也是“abcd ”(带有两个空格)这种类型的数据才会被返回。如果被查询的内容是“abcd ”(不带空格或者带有一个空格)则数据库系统会认为这与查询条件不相符合,故不会返回相关的记录。故Like关键字对于空格是比较敏感的。为此在使用Like关键字时候需要特别注意这个问题。如果用户或者程序开发人员不能够确定abcd后面到底是否有空格,则可以通过通配符拉实现。即可以利用”%abcd%”为条件语句。如此的话,无论abcd前面或者后面是否有空格,则都会被查询出来。但是全文搜索的话,通常情况下系统会把空格忽略掉。即在全文搜索功能中,系统会先对查询条件语句进行优化。如果发现空格的话,则往往会实现把空格过滤掉。故全文搜索的话,对于空格等特殊字符往往是不敏感的。 三、对于一些特殊字符的处理要求。 由于数据类型不同,其数据存储方式也不同。为此某些特殊的数据类型可能无法通过Like关键字来实现模糊查询。如对于办好char和varchar数据的模式的字符串比较可能无法通过Like关键字来实现。也就是说,Like关键字后面带的条件语句仅对字符模式有效,不能够使用Like条件语句来查询格式化的二进制数据等等。为此如果数据库管理元要采用Like 关键字,则其必须了解每种数据类型的存储方式以及导致Like关键字比较失败的原因。知己知彼,百战百胜。只有如此数据库管理员才能够避免因为在不恰当的地方采用了Like关键字而造成查询的错误。不过值得高兴的是,Like关键字支持ASCII模式匹配与Unicode模式匹配。如果Like关键字的所有参数都为ASCII字符数据类型,则Like关键字会自动采用ASCII 模式匹配。如果其中任何一个参数为Unicode数据类型,则系统会把所有的参数都转换为Unicode数据类型,并执行Unicode模式匹配。另外需要注意的是,如果Like关键字加上Unicode的数据类型则后面条件语句的空格是有效的,即比较时会考虑到后面出现的空格。

mysql性能优化-慢查询分析、优化索引和配置

mysql性能优化-慢查询分析、优化索引和配置目录 一、优化概述 二、查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 profiling分析查询 2索引及查询优化 三、配置优化 1) max_connections 2) back_log 3) interactive_timeout 4) key_buffer_size 5) query_cache_size 6) record_buffer_size 7) read_rnd_buffer_size 8) sort_buffer_size 9) join_buffer_size 10) table_cache 11) max_heap_table_size 12) tmp_table_size

13) thread_cache_size 14) thread_concurrency 15) wait_timeout 一、优化概述 MySQL数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在网络上,那么查询量相当大的时候那么平瓶颈就会出现在网络上,我们可以用mpstat, iostat, sar和vmstat来查看系统的性能状态。 除了服务器硬件的性能瓶颈,对于MySQL系统本身,我们可以使用工具来优化数据库的性能,通常有三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。 二、查询与索引优化分析 在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有慢查询日志,EXPLAIN 分析查询,profiling分析以及show命令查询系统状态及系统变量,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。 1 性能瓶颈定位 Show命令 我们可以通过show命令查看MySQL状态及变量,找到系统的瓶颈: Mysql> show status ——显示状态信息(扩展show status like ‘XXX’) Mysql> show variables ——显示系统变量(扩展show variables like ‘XXX’) Mysql> show innodb status ——显示InnoDB存储引擎的状态 Mysql> show processlist ——查看当前SQL执行,包括执行状态、是否锁表等

SQL Server2008中全文检索的实现5页

SQL Server2008中全文检索的实现 1 引言 随着计算机的普及和网络技术的发展,我厂的生产管理、数据查询、公文流转等大都实现了计算机管理,方便了信息交流与共享,提高了生产效率。但是,目前针对散落在个人、单位电脑中的WORD文档、电子表格以及多媒体汇报(PPT)文档等还没有一套完整的管理系统,既造成了存储资源的浪费,又不利于资源的共享。因此,需要一个文档信息管理系统,把这些分散的文档集中存储到数据库中,为用户提供一个统一的、可以多方式检索的平台,方便用户进行科学、高效地获取信息。 而对存储在数据库中的大量非结构化的文档数据进行查询时,通过普通的SQL语句是无法实现的(不能使用LIKE谓词来查询格式化的二进制数据);即使是非二进制的普通类型字段查询,对数百万行文本数据执行的LIKE 查询可能需要花费几分钟时间才能返回结果;但对同样的数据,全文索引查询只需要几秒或更少的时间。因此要实现一个能够快速实现检索的文档管理平台,有必要应用全文检索技术。 2 全文索引简介 全文索引是以文本数据为主要处理对象,提供根据数据资料的内容来实现的信息检索。全文搜索通常用于基于Web的应用程序、文档管理系统以及自定义应用程序,以便对存储在数据库中的数据提供文本搜索功能。 Microsoft公司开发的SQL Server 2008是一款面向高端的数据库系统,它继承了SQL SERVER以前版本的一些强大的优势,界面更加友好。它的全文索引功能配置简单、使用方便,为索引和查询数据库中存储的结构

化和非结构化文本数据提供了可靠、快速而灵活的方法。 3 全文索引实现过程 下面以多媒体信息管理平台为例,详细介绍一下全文索引的实现方法。 第一步,登陆SQL Server 2008服务器 第二步,在SQL Server中建立一个使用全文索引的数据库dmtpt,要选中使用全文索引选项。在该数据库中建立一个存储文档文件的表 main_files。 第三步,在main_files表上点击右键,选择“定义全文索引”,进入全文索引向导对话框。 第四步,选择将要对其进行全文索引的列。 第五步,选择数据发生变化时,全文索引的更新方式。这里选择自动,以保证更改的数据随时会被检索到。 第六步,全文目录的作用是存储全文索引,要创建全文索引必须先创 建全文目录。 第七步,定义填充计划可以添加或修改确定何时填充或重新填充全文目录的计划。第八步,完成全文索引向导。 以上是建立全文索引的全过程。完成建立后,使用全文索引语句,即可以对其进行全文检索。 4 全文索引语句CONTAINS和FREETEXT的使用 SQL Server 2008提供的全文索引语句主要有CONTAINS和FREETEXT。CONTAINS语句的功能是在表的所有列或指定列中搜索:词或短语、词或短

如何用C#实现数据库全文检索

如何用C#实现数据库全文检索 目前行业网站的全文检索的方式主要有两种 方式一:通过数据库自带的全文索引 方式二:通过程序来自建全文索引系统 以Sql Server 2005为例 2005本身就自带全文索引功能,你可以先对数据库表建立索引,具体如何建索引网上搜索一下,建立完索引之后,你就可以用SQL来实现检索功能,例如:select * from ytbxw where contaiins(字段,' 中国');多个查询值之间可以用and 或or来实现,在单表以及单表视图上建全文索引对2005来说根本不是问题,但在多表视图建全文索引2005目前还无法实现这个功能,拿https://www.doczj.com/doc/cc14657233.html,为例,其每个栏目的信息都是分开存放的,所以在检索上就无法用该方法来解决这个问题. 下面重点说一下如何用程序来实现检索功能 如果你想自己开发一个全文检索系统,我想这是相当复杂事情,要想实现也不是那么容易的事情,所以在这里我推荐一套开源程序,那就是 DotLucene,我想大家可能都听过这个东东吧,那我就讲讲如何来实现多表情况下的全文检索. 1、新建winform项目,把https://www.doczj.com/doc/cc14657233.html,.dll添加到该项目中来 2、创建一个类,类名可以自己取 public class Indexer { private IndexWriter writer; //在指定路径下创建索引文件 public Indexer(string directory) { writer = new IndexWriter(directory, new StandardAnalyzer(), true); writer.SetUseCompoundFile(true); }

Lucene:基于Java的全文检索引擎简介

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。 https://www.doczj.com/doc/cc14657233.html,/tech/lucene.html -------------------------------------------------------------------------------- Lucene是一个基于Java的全文索引工具包。 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 全文检索的实现:Luene全文索引和数据库索引的比较 中文切分词机制简介:基于词库和自动切分词算法的比较 具体的安装和使用简介:系统结构介绍和演示 Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 从Lucene我们还可以学到什么 基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin 搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。 Lucene的发展历程:早先发布在作者自己的https://www.doczj.com/doc/cc14657233.html,,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:https://www.doczj.com/doc/cc14657233.html,/lucene/ 已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有: Jive:WEB论坛系统; Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“TheLucene search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。 Cocoon:基于XML的web发布框架,全文检索部分使用了Lucene Eclipse:基于Java的开放开发平台,帮助部分的全文索引使用了Lucene 对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于Lucene 的结构的介绍,你会了解到由于Lucene良好架构设计,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。 全文检索的实现机制 Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构/接口中。总体上看:可以先把Lucene当成一个支持全文索引的数据库系统。

相关主题
文本预览
相关文档 最新文档