关闭

全文检索(五)

849人阅读 评论(0) 收藏 举报

使用CONTAINSTABLE搜索

CONTAINSTABLE函数与CONTAINS谓词类似,其可以返回符合条件的多条记录,但是返回的记录是作为数据表出现在SELECT语句的FROM子句中。这个数据表里只包含两个字段:一个字段名为“KEY”,该字段显示的是全文索引的唯一索引键的内容,也就是图14.6所示界面中所创建的索引列;另一个字段名为“RANK”,该字段是排名值字段,其排名值是由系统依查询符合的程度自动生成的。CONTAINSTABLE的语法代码为:

CONTAINSTABLE ( table , { column_name | (column_list ) | * } , ' < contains_search_condition > '

     [ , LANGUAGE language_term]

  [ ,top_n_by_rank ]

   )

< 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 ]

        )

从以上代码可以看得出,CONTAINSTABLECONTAINS的搜索条件一样分为五类,其形式也几乎一样,只是增加了tabletop_n_by_rank两个参数:

l  table:全文索引所在的数据表名。

l  top_n_by_rank:返回的记录数,相当于SELECT语句中的top n

下面举几个例子说明CONTAINSTABLECONTAINS在用法上不同的地方。

例八、查看文章表中内容含有教育部的记录的编号,其代码如下:

SELECT * FROM

         CONTAINSTABLE(文章,内容,'教育部') as table1

在本例中可以看到,CONTAINSTABLE返回的结果是作为数据表的形式出现在FROM子句中。其运行结果如图23所示,查询的结果也就是CONTAINSTABLE返回的数据表的结果,只有两个字段。

23 例八的运行结果

例九、查看文章表中内容含有教育部表示的前十条记录,并按查询符合程度排序,其代码如下:

SELECT * FROM 文章 JOIN

         CONTAINSTABLE(文章,内容,' "教育部" NEAR "表示" ',10) as table1

         ON 文章.编号= table1.[KEY]

         ORDER BY table1.RANK DESC

其运行结果如图24所示,在本例中,将CONTAINSTABLE函数返回的数据表与文章表JOIN起来进行联合查询,就好像一个真实的数据表一样。由于KEY是关键字,所以在本例当中用方括号将KEY括起来。

24 例九的运行结果

例十、搜索文章表中内容中含有“download”上海山西的记录,并为不同的条件加上加权值,然后按权值排序。其代码如下:

SELECT * FROM 文章 JOIN

         CONTAINSTABLE(文章,内容,

                   'ISABOUT ("download" weight(0.9),

                   "上海"  weight(0.6),

                   "山西"  weight(0.1))') AS TABLE1

         ON 文章.编号 = TABLE1.[KEY]

         ORDER BY TABLE1.RANK DESC

其运行结果如图25所示,RANK字段是依符合程度生成的数据再加上权值后的结果。

25 例十的运行结果

 使用FREETEXTTABLE搜索

CONTAINSTABLE一样,FREETEXTTABLE函数也是返回拥有KEYRANK两个字段的表,该表可以和数据库中的数据表一样使用。FREETEXTTABLE的语法代码如下所示:

FREETEXTTABLE (table , { column_name | (column_list) | * }

          , 'freetext_string'

     [ ,LANGUAGE language_term ]

     [ ,top_n_by_rank ] )

由以上代码可以看出FREETEXTTABLE函数与FREETEXT谓词的语法代码相似,只是多了tabletop_n_by_rank两个参数。

例十一、查看文章表中内容字段含有教育部的前十条记录,其代码如下:

SELECT 文章.内容,TABLE1.* FROM 文章JOIN

         FREETEXTTABLE(文章,内容,'教育部',8) AS TABLE1

         ON 文章.编号= TABLE1.[KEY]

运行结果如图26所示:

26 例十一的运行结果

14.7.5  搜索image字段

SQL Server 2005image类型的字段里,不仅仅是可以存储图形文件,还可以存储如可执行文件、音乐文件、文本文件等众多文件类型。SQL Server 2005支持对存储在image类型的字段里的一些文件的内容进行全文搜索,但在创建全文索引时必须指明存储在image字段里的文件的类型。如图7所示。

SQL Server 2005支持对存储在image中的纯文本文件、网页文件、Word文件、Excel文件和PowerPoint文件的内容进行查询,其扩展名字段必须分别为txthtmdocxlsppt。全文索引创建完毕后,对image字段里的文件内容进行查询的方法与其他字段的查询方法是一样的:

例十二、查询存储在文章表的文件字段里的内容包含数据库的文件,其代码如下:

SELECT 编号,标题,文件,扩展名 FROM 文章

         WHERE CONTAINS(文件,'数据库')

  2005新增:与全文索引相关的T-SQL语句

SQL Server 2005以前的版本中,创建与管理全文目录、全文索引主要是使用存储过程来完成。从SQL Server 2005开始新增加了一些与全文索引相关的T-SQL语句,可以用来创建与管理全文目录和全文索引。

  创建全文目录

创建全文目录的T-SQL语句为:

CREATE FULLTEXT CATALOG catalog_name

     [ON FILEGROUP filegroup ]

     [IN PATH 'rootpath']

     [WITH <catalog_option>]

     [AS DEFAULT]

     [AUTHORIZATION owner_name ]

<catalog_option>::=

     ACCENT_SENSITIVITY = {ON|OFF}

其中参数说明如下:

l  catalog_name:全文目录名称。

l  ON FILEGROUP filegroup:包含全文目录的文件组名。

l  IN PATH 'rootpath':全文目录的路径。

l  AS DEFAULT:指定该全文目录为默认目录。

l  AUTHORIZATION owner_name:将全文目录的所有者设为数据库用户名或角色的名称。

l  ACCENT_SENSITIVITY:设置该全文目录的全文索引是否区分重音。

例十三、在Northwind数据库中创建一个名为“TSQL全文目录全文目录,其代码如下:

CREATE FULLTEXT CATALOG TSQL全文目录

         ON FILEGROUP [PRIMARY]

         IN PATH 'E:/book/SQL Server 2005大全/数据库/第十四章/运行后数据库'

         AS DEFAULT

  更改全文目录属性

创建完全文目录之后,如果发现其设置有不如意之处,可以用T-SQL语句对其进行修改。更改全文目录属性的T-SQL语句代码如下:

ALTER FULLTEXT CATALOG catalog_name

{ REBUILD [ WITH ACCENT_SENSITIVITY = { ON | OFF } ]

| REORGANIZE

| AS DEFAULT

}

其中参数说明如下:

l  catalog_name:全文目录名称

l  REBUILD:重新生成全文目录。

l  WITH ACCENT_SENSITIVITY:设置该全文目录的全文索引是否区分重音。

l  REORGANIZE:执行主合并索引以便将在索引过程中创建的各个较小的索引合并成一个大索引。

l  AS DEFAULT:指定该全文目录为默认目录。

例十四、重新生成“TSQL全文目录,其代码如下:

ALTER FULLTEXT CATALOG TSQL全文目录

         REBUILD

 创建全文索引

有了全文目录后,可以在全文目录里创建全文索引。一个全文目录里可以包含多个全文索引,但一个全文索引只能属于一个全文目录。每个数据表只能有一个全文索引。创建全文索引的T-SQL语句代码如下:

CREATE FULLTEXT INDEX ON table_name

     [(column_name [TYPE COLUMN type_column_name]

          [LANGUAGE language_term] [,...n])]

     KEY INDEX index_name

          [ON fulltext_catalog_name]

     [WITH

          {CHANGE_TRACKING {MANUAL | AUTO | OFF [, NO POPULATION]}}

     ]

其中参数说明如下:

l  table_name:数据表名。

l  column_name:全文索引中包括的一列或多列的名称。只能对类型为charvarcharncharnvarchartextntextimagexmlvarbinary的列进行全文索引。

l  TYPE COLUMN type_column_name:用于存储column_name的文档类型的数据表中的列名。

l  LANGUAGE language_term:存储在column_name中的数据所用的语言。

l  KEY INDEX index_name:数据表中唯一键索引的字段名。

l  ON fulltext_catalog_name:全文目录名。

l  MANUAL:指定是使用SQL Server代理还是手动传播跟踪日志。

l  AUTO:当关联的数据表中修改了数据时,SQL Server自动更新全文索引。

l  OFF[,NO POPULATION]:不保留对索引数据的更改列表。

例十五、为文章表的标题内容文件三个字段创建全文索引,其代码如下:

CREATE FULLTEXT INDEX

         ON 文章(标题,内容,文件 TYPE COLUMN 扩展名)

         KEY INDEX PK_文章

         ON TSQL全文目录

注意:由于在前面的章节里已经为文章表创建了全文索引,因此在运行本例之前要先把原来创建的全文索引删除。

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:238054次
    • 积分:2950
    • 等级:
    • 排名:第12409名
    • 原创:24篇
    • 转载:102篇
    • 译文:0篇
    • 评论:95条
    文章分类
    最新评论