全文搜索存储过程没有结果,尽管存在相关数据

full text search stored procedure get no results although relevant data exists

与我们的一位客户合作的项目的一部分涉及在希伯来语 1037 中创建全文索引(数据库中同时包含英语和希伯来语),这将与用 [=30] 编写的 UI 系统相对应=] 和 C#。数据库本身整理为 Latin1_General_100_CI_AS。 存储过程获取一个搜索参数,假设获取单个单词输入,SP 中的代码使用该参数进行不同的全文搜索查询。

发生的第一件奇怪的事情是,当我传递带或不带引号的字符串时,一切正常。我了解到这是一个已知错误,Microsoft 不打算很快修复它。

真正的问题在于传递的实际字符串。

当我传递希伯来语字符串或数字值时 - 一切正常,SQL 服务器获取相关数据(通过 UI 和 SSMS)。

当我通过 SSMS 传递一个英文字符串时,SQL 服务器回复相关数据但是当 UI 系统传递一个参数时它得到没有数据返回。

以下SQL代码是我使用的非常基础的代码:

ALTER PROCEDURE dbo.SearchByFreeText 
@StringToSearch NVARCHAR(500) = NULL

AS

SELECT *
FROM SampleTable
WHERE CONTAINS(SampleColumn, @StringToSearch)
OR 
FREETEXT(SampleColumn, @StringToSearch)

非常感谢您在这件事上的帮助。

谢谢!

尝试在调用 CONTAINS or FREETEXT 时显式设置 language_term。来自文档:

CONTAINS (... [ , LANGUAGE language_term ] )

language_term is the language to use for word breaking, stemming, thesaurus expansions and replacements, and noise-word (or stopword) removal as part of the query.

language_term can be specified as a string, integer, or hexadecimal value corresponding to the LCID of a language. If language_term is specified, the language it represents will be applied to all elements of the search condition. If no value is specified, the column full-text language is used.

看起来您的 FTS 语言确实不匹配,当您在 SSMS 中 运行 查询时,SSMS 设法确定正确的语言。

因此,当从 UI SQL 传递英文字符串时,服务器可能会尝试根据希伯来语索引对其进行检查。不是最终解决方案,而是尝试将英语语言代码 (1033) 硬编码到 SQL 查询中,并从 UI 传递英语搜索词以查看是否会找到任何内容:

SELECT *
FROM SampleTable
WHERE CONTAINS(SampleColumn, @StringToSearch, LANGUAGE 1033)
OR 
FREETEXT(SampleColumn, @StringToSearch, LANGUAGE 1033)

如果它确实找到结果,那么您可能必须即时确定搜索词的语言并通过动态 SQL 或 IF (@lang = 1033) 块启用正确的 LANGUAGE 参数.

HTH

尝试了解以下不同之处:

  1. SELECT * FROM content WHERE freetext(description,"SQL MGT")

    虽然这似乎是在字符串 "SQL MGT," 上搜索,但它实际上是在 "SQL" 或 "MGT."

  2. 上搜索
  3. SELECT * FROM content WHERE CONTAINS(description, 'NT NEAR great')

    在“说明”列上的此搜索查找 "NT" 在 "great" 附近的所有行。