根据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]
答案 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)。