【问题标题】:Full Text Search SQL can't find digital value in nvarchar field全文搜索 SQL 在 nvarchar 字段中找不到数字值
【发布时间】:2017-09-28 07:15:03
【问题描述】:

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

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

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

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

发生了什么事?

截图:

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

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

【问题讨论】:

  • 我想你的意思是一个数值,或者一个数字序列。
  • 你的意思是如果你输入 121 那么没有结果显示?
  • @YogeshSharma 是的,对
  • @Sevastsyan Oseev 和您预期的 o/p 想要 121 或整个字符串??
  • @SevastsyanOseev 请向我们展示您的查询。

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


【解决方案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_parser 一起玩,看看 SQL FTS 引擎如何分解您的输入并相应地调整您的查询。

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

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

【讨论】:

    【解决方案2】:

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

    您的查询错误,您有错字,请写121 而不是120

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

    【讨论】:

      猜你喜欢
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2011-06-23
      • 2014-03-04
      • 1970-01-01
      相关资源
      最近更新 更多