全文搜索SQL无法在nvarchar字段中找到数字值

时间:2017-09-28 07:15:04

标签: sql sql-server full-text-search fulltext-index

我有一个存储过程,它使用全文搜索我的nvarchar字段。当我意识到,如果我只键入此字段的数值,则全文搜索无法找到字段。

例如,我的表格中有字段名称,其值为“Request_121”

如果我输入Запрос_120Request - 可以

如果我输入120 - 找不到任何内容

发生了什么事?

截图:

  1. 未找到任何结果:https://gyazo.com/9e9e061ce68432c368db7e9162909771

  2. 搜索到的结果:https://gyazo.com/e4cb9a06da5bf8b9f4d702c55e7f181e

2 个答案:

答案 0 :(得分:1)

您在完整索引列中找不到121字词部分,因为SQL Server将Request_121视为单个术语。您可以通过手动运行fts解析器来验证这一点:

select * from sys.dm_fts_parser('"Request_121"', 1033, 0, 0)

返回:

enter image description here

跑步时

select * from sys.dm_fts_parser('"Request 121"', 1033, 0, 0)

返回:

enter image description here

注意,在第二个示例中,121被选为单独的搜索词。

您可以做的是尝试在FTS查询中使用通配符,如:

FROM dbo.CardSearchIndexes idx WHERE CONTAINS(idx.Name, '"121*"');

然而,我再次怀疑它会选择121在一个不可破解的单词部分,只有当你有121作为独立单词时。与sys.dm_fts_parser一起玩,看看SQL FTS引擎如何分解您的输入并相应地调整您的查询。

更新:我注意到您使用西里尔语搜索字词和英语。请注意,在运行FTS查询时,了解为Name列创建FTS索引时指定的语言也很重要。如果FTS语言区域设置为西里尔语,则在Request列中找不到英语术语Name

注意,在我上面的dm_fts_parser示例中,我使用了1033(英语)语言ID。检查CREATE FULLTEXT INDEX语句中的LANGUAGE language_term运算符,以检查FTS索引使用的语言。

答案 1 :(得分:0)

  

我的表中有字段名称,值为'Request_121'

您的查询错误,输入错误,请写121而不是120

FROM dbo.CardSearchIndexes idx WHERE CONTAINS(idx.Name, '121');