SQL Server全文搜索中的Postfix术语

时间:2009-09-07 06:45:37

标签: sql-server full-text-search

根据MSDN文章,'CONTAINS'TSQL函数有一个名为prefix_term的参数,文档说:

  

< prefix_term>

Specifies a match of words or phrases beginning with the specified
     

文本。将前缀术语括在double中   引号(“”)并添加一个   结尾前的星号(*)   引号,使所有文字   从简单的术语开始   在星号之前指定   匹配。

嗯,这是前缀,如果我搜索“Ira *”,它会发现“伊朗,伊朗,伊拉克,Irascible等”。

但我正在寻找后缀术语,所以如果我搜索“* ran”,那么我希望在结果中看到伊朗,三体船等。

我该怎么做?

[UPDATE]

我在ArticleContent列中有这样的术语:

f5_Iran_three_islands

此查询捕获它:

Select Code,ArticleContent from Articles Where ArticleContent Like '%Ira%'

但是我不能通过这个查询来抓住这一行:

Select Code FROM Articles WHERE CONTAINS(ArticleContent, '"*Ira*"')

[/ UPDATE]

3 个答案:

答案 0 :(得分:1)

伊朗:)陷入同样的​​问题。您可以在另一列中创建文本的反转副本,然后查找反转值。

declare @value varchar(50), @value_contains varchar(53), @value_contains_reverse varchar(53)
set @value = '20602019';
set @value_contains = '"'+@value+'*"';
set @value_contains_reverse = '"'+reverse(@value)+'*"';
select charindex(@value, matchstring) from Table 
where contains(matchstring, @value_contains) or contains(matchstring_reverse,@value_contains_reverse)

答案 1 :(得分:1)

我认为,在 SQL Server 中进行全文搜索时,这是一个常见的误解。

全文搜索可以搜索整个单词以及许多其他内容。来自 CONTAINS 文档

CONTAINS 可以搜索:

<块引用>

一个词或词组。

单词或短语的前缀。

一个词接近另一个词。

从另一个词屈折生成的词(例如,词 drive 是驱动、驱动、驱动和被驱动的屈折词干)。

一个词是另一个词的同义词,使用同义词库(对于 例如,“金属”一词可以有“铝”和“铝”等同义词 “钢”)。

所以就像文本字符串上的普通索引一样,您可以进行前缀搜索。

无论是全文搜索还是普通的 SQL Server 索引,都不支持在单词或文本字符串中进行“后缀”或“包含”搜索。所以基本上没有前导通配符。

请注意,同样的限制适用于 CONTAINSTABLE:

CONTAINSTABLE 可用于与 CONTAINS 谓词相同类型的匹配,并使用与 CONTAINS 相同的搜索条件。

我认为存在这些限制是因为索引在 SQL Server 中的逻辑存储方式 - 作为 b 树,根据索引的开头很容易“跳转”或“寻找”到索引的不同部分索引列中的数据。

答案 2 :(得分:0)

正如您所发现的那样,文档声明只有前缀术语才有可能。 MSDN: CONTAINS (Transact-SQL)

如果您希望使用后缀术语,您可以使用标准通配符搜索(LIKE等),或者考虑编写使用正则表达式搜索的.Net存储过程。我之前已经完成了,并且sp的写入并不是那么难,尽管将其加载到服务器中是一件痛苦的事(.Net 2,SQL Server 2005)。