2

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

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

如果我输入Запрос_120Request- 没关系

如果我输入120- 什么都找不到

到底是怎么回事?

截图:

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

  2. 结果发现:https ://gyazo.com/e4cb9a06da5bf8b9f4d702c55e7f181e

4

2 回答 2

1

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

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

回报:

在此处输入图像描述

在跑步的时候:

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

回报:

在此处输入图像描述

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

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

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

但是,我再次怀疑它是否会选择121在不可破坏的单词部分中,只有当您拥有121独立单词时。试试看sys.dm_fts_parserSQL FTS 引擎如何分解您的输入并相应地调整您的查询。

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

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

于 2017-09-28T08:15:31.450 回答
0

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

你的查询是错误的,你有一个错字,写121而不是120

FROM dbo.CardSearchIndexes idx WHERE CONTAINS(idx.Name, '121');
于 2017-09-28T07:41:19.847 回答