-- =========================================================================================
-- 2007/06/06 SQL学习-- 全文索引
-- =========================================================================================
--
-- 全文索引是基于标记的功能性索引,使用全文引擎服务创建和维护的。
-- 根据特定的语言的规则对词和短语的搜索,使针对语言的搜索。
-- 相关术语:
-- 全文索引:是一种特殊的索引,能在给定的列中存储有关重要的词及为位置的信息,
-- 使用这些信息可以快速的进行全文查询,搜索包括特定词或词组的行。
-- 全文目录:存储全文索引
-- 断字符与词干分析器
-- 标记
-- 筛选器
-- 填充(爬网):创造维护全文索引的过程叫填充,也叫爬网。
-- 干扰词
-- 创建全文索引的注意事项:
-- 1)全文索引是指对数据表的,只能对数据表创建全文索引,不能对数据库创建全文索引
-- 2)一个数据库中可以创建多个全文目录,每个全文目录都可以存储一个或多个全文索引,但每一个数据表只能创建
-- 一个全文索引,一个全文索引中可以包含多个字段。
-- 3)要创建全文索引的标必须要有主键,或者是具备唯一性的非空索引,并且这个主键或具有唯一性的非空索引只能是
-- 一个字段,不能是多个字段的组合。
-- 4)包含在全文索引里的字段只能是字符型的或Image型的字段。
-- 在 where 子句里设置全文搜索的查询条件,可以使用 contains 和 freetext 两个谓词
-- 在 from 子句里设置全文搜索的查询条件,可以使用 containstable 和 freetexttable 两个行集值函数
-- 使用contains搜索
-- 1) 简单词
-- 2)派生词
-- 3)前缀词
-- 4)加权词
-- 5)临近词
-- CONTAINS 谓词可以搜索:
-- 词或短语。
-- 词或短语的前缀。
-
-- 与另一个词相邻的词。
-- 由另一个词的词形变化而生成的词(例如,drive 一词是 drives、drove、driving 和 driven 词形变化的词干)。
-- 使用同义词库确定的另一个词的同义词(例如,metal 一词可能有 aluminum 和 steel 等同义词)。
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 ]
)
< AND > :: =
{ AND | & }
< AND NOT > :: =
{ AND NOT | & !}
< OR > :: =
{ OR | | }
-- 简单词的搜索方式
--
select * from books
where contains (title, ' us ' )
--
select * from books
where contains (title, ' "us" and "C++" ' )
--
select * from books
where contains (title, ' "xml" or "LET" ' ) -- 不能写为 contains(title,'xml' or 'LET')
-- 派生词的搜索方式
-- 主要用在英文当中
-- 需要改变断字符的语言
select * from books
where contains (title, ' formsof(inflectional,program) ' )
-- 前缀词的搜索方式
-- 也是用在英文中
select * from books
where contains (title, ' "C*" ' ) -- 只能使用*,并且只能放在英文字母之后,如"*c","*C*"都是错误的
-- 临近词的搜索方式
-- 可以搜索记录中位置相近的两个字符
--
insert into books
(book_id,title)
values ( 77 , ' 中华人民共和国 ' )
--
select * from books
where contains (title,N ' "中华" near "共和" ' )
-- 使用freetext搜索
-- freetext的搜索方式是将一个句子中的每个单字拆分开进行搜索的.
select * from books
where freetext (title, ' 中华 ' )
-- 使用 containstable 搜索
-- 其返回的记录是作为数据表出现在select语句的from子句之中的
-- key 该字段表示的是全文索引的唯一索引键的内容
-- rank 该字段时排名值字段,其排名值是系统依查询符合的程度自动生成的
select * from
containstable (books,title, ' let ' ) as table1
-- 使用 freetexttable 搜索
select books.title,table1. * from books
join freetexttable (books,title, ' let ' , 1 ) as table1
on books.book_id = table1. [ key ]
-- SQL Server 2005 新增功能: 与全文索引相关的T-SQL语句
-- 创建全文目录
--
create fulltext catalog TSQLFull
-- 创建全文索引
--
create fulltext index on authers
-- on authers(lastname,firstname,company type column testname)
key index PK__authers__1B0907CE
on TSQLFull
-- 要删除的全文目录必须为空,即不能包含有全文索引