全文未索引 varbinary 列(使用 html)

Ale*_*lex 4 sql-server full-text-search

我有一个包含 HTML 数据的表格,我想通过 html 过滤器使用全文索引进行搜索

所以我创建了一个索引:

CREATE FULLTEXT CATALOG myCatalog AS DEFAULT

CREATE FULLTEXT INDEX ON myTable (Body TYPE COLUMN Filetype)
                        KEY INDEX PK_myTable
Run Code Online (Sandbox Code Playgroud)

Body是一个varbinary(max)带有 HTML的列。该Filetype列是一个计算列返回.html

没有返回任何结果。

我确认.html安装了过滤器。如果我将列转换为“纯文本”索引(不是 html)并仅创建一个“纯文本”索引,则全文索引也已正确安装并且可以正常工作nvarchar

SQL 日志或 FTS 日志中没有错误。

关键字表是空的!

SELECT *
FROM sys.dm_fts_index_keywords
(DB_ID('myDatabase'), OBJECT_ID('myTable'))
Run Code Online (Sandbox Code Playgroud)

它返回的只是“END OF FILE”符号。

在此处输入图片说明

它说“文档计数 35”,这意味着文档已被处理,但未提取任何关键字。

附注。我有 SQL Server Express Edition 2012(具有包括全文在内的所有高级功能)。这可能是原因吗?但同样,“纯”全文搜索工作得很好!

聚苯乙烯。让我的同事在 SQL Express 2016 上对此进行测试 - 结果相同......在我们的生产服务器“企业”版上尝试过 - 相同。

更新

好吧,事实证明全文索引不支持 UNICODE!!在 varbinary 列中。当我将列转换为非 unicode(通过将其转换为nvarcharthen tovarchar然后再转换为varbinary)时,它开始工作。

任何人都知道任何解决方法?

Ale*_*lex 6

好的,事实证明全文索引确实支持 unicode 数据,varbinary但要注意这一点:

如果您的varbinary列是从创建的,请Nvarchar确保0xFFFE在开头包含unicode 签名

例如,我将计算列用于全文索引,因此我不得不将计算列更改为:

alter table myTable
add FTS_Body as 0xFFFE + (CAST(HtmlBody as VARBINARY(MAX)))
--HtmlBody is my nvarchar column that contains html
Run Code Online (Sandbox Code Playgroud)