全文搜索存储过程没有结果,尽管存在相关数据
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
尝试了解以下不同之处:
SELECT * FROM content WHERE freetext(description,"SQL MGT")
虽然这似乎是在字符串 "SQL MGT," 上搜索,但它实际上是在 "SQL" 或 "MGT."
上搜索
SELECT * FROM content WHERE CONTAINS(description, 'NT NEAR great')
在“说明”列上的此搜索查找 "NT" 在 "great" 附近的所有行。
与我们的一位客户合作的项目的一部分涉及在希伯来语 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
尝试了解以下不同之处:
SELECT * FROM content WHERE freetext(description,"SQL MGT")
虽然这似乎是在字符串 "SQL MGT," 上搜索,但它实际上是在 "SQL" 或 "MGT."
上搜索
SELECT * FROM content WHERE CONTAINS(description, 'NT NEAR great')
在“说明”列上的此搜索查找 "NT" 在 "great" 附近的所有行。