在SQL Server中如何使用TYPE COLUMN选项创建全文索引

时间:2015-12-16 09:34:44

标签: html sql-server sql-server-2012 full-text-search full-text-indexing

我有一个表定义如下

CREATE TABLE [dbo].[Dialogs](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DiscussionID] [int] NOT NULL,
    [ApprovedByUserID] [int] NULL,
    [AddedByUserID] [int] NULL,
    [Text] [nvarchar](max) NULL,
    [ApprovalStatus] [int] NULL,
    [ApprovedOn] [datetime] NULL,
    [AddedOn] [datetime] NOT NULL,
 CONSTRAINT [PK_dbo.Dialogs] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Text列包含用户输入的html。我想在Text列上创建全文索引,我还需要支持html过滤器,以便当任何用户键入<div><p>或任何其他html标记时,它不会返回任何结果

要创建索引,请在SQL

下方使用
CREATE FULLTEXT INDEX ON [Dialogs]
 ( 
  [Text] TYPE COLUMN '.html'
 ) 
  KEY INDEX [PK_dbo.Dialogs]
      ON AOPRDefault; 

但是SQL Server会抛出错误

  

'。html'附近的语法不正确。

任何人都可以举例说明在创建全文索引时如何指定TYPE COLUMN选项。

1 个答案:

答案 0 :(得分:5)

首先,问题是你应该引用一个你有'.html'而不是文字的列,所以你可能会有类似的东西:

-- ADD COMPUTED COLUMN TO STORE FILE TYPE
ALTER TABLE dbo.Dialogs ADD FileExtension AS '.html'; 

CREATE FULLTEXT INDEX ON dbo.Dialogs ([Text] TYPE COLUMN FileExtension)
    KEY INDEX [PK_dbo.Dialogs] ON AOPRDefault;

然而,根据the documentation,您误解了TYPE COLUMN属性的目的:

  

TYPE COLUMN type_column_name

     

指定表列的名称type_column_name,用于保存varbinary(max)或image文档的文档类型。此列称为类型列,包含用户提供的文件扩展名(.doc,.pdf,.xls等)。 type列的类型必须为char,nchar,varchar或nvarchar。

     

仅当column_name指定varbinary(max)或image列时才指定TYPE COLUMN type_column_name,其中数据存储为二进制数据;否则,SQL Server会返回错误。

     

注意

     

在索引编制时,全文引擎使用每个表行的类型列中的缩写来标识要在column_name中用于文档的全文搜索过滤器。过滤器将文档作为二进制流加载,删除格式信息,并将文档中的文本发送到分词器组件。有关详细信息,请参阅配置和管理搜索过滤器

由于索引位于文本列上,因此不适用,并且create index语句将返回错误。即使你将html文档存储为二进制数据,它仍然无法按预期工作,你所追求的是html parsing,这是一个与全文索引不同的问题。