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)时,它开始工作。
任何人都知道任何解决方法?
好的,事实证明全文索引确实支持 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)