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

时间:2017-03-03 10:05:21

标签: sql angularjs sql-server full-text-search full-text-indexing

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

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

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

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

当我通过 SSMS 传递英文字符串时,SQL Server会回复相关数据,但是当UI系统传递参数时,它不会返回任何数据。

以下SQL代码是我使用的代码,它非常基本:

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

AS

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

我非常感谢有关此事的一些帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

在致电CONTAINSFREETEXT时,请尝试明确设置language_term。来自文档:

CONTAINS (... [ , LANGUAGE language_term ] )
  

language_term 是用于断字,词干,词库扩展和替换以及将查询中包含噪音词(或禁用词)的语言。

     

language_term可以指定为与语言的LCID对应的字符串,整数或十六进制值。如果指定了language_term,则它所代表的语言将应用于搜索条件的所有元素。 如果未指定任何值,则使用列全文语言

看起来你确实有一个FTS语言不匹配,当你在SSMS中运行查询时,SSMS以某种方式设法确定正确的。

因此,当从UI传递英文字符串SQL Server可能会尝试检查它与希伯来语索引。不是最终的解决方案,但尝试将英语代码(1033)硬编码为SQL查询,并从UI传递英语搜索词以查看是否有任何内容:

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

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

HTH

答案 1 :(得分:0)

尝试理解下面的不同之处:

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

    虽然这似乎搜索字符串“SQL MGT”,但它实际上搜索“SQL”或“MGT”。

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

    “描述”列上的此搜索会查找“NT”接近“很棒”的所有行。

相关问题