使用带有FORMSOF和星号的CONTAINSTABLE

时间:2016-11-11 13:04:17

标签: sql sql-server

我正在尝试将CONTAINSTABLEFORMSOF一起使用并使用星号搜索前缀。这是可能的,如果是这样,那么正确的语法是什么?

我的(错误的)尝试是:

CONTAINSTABLE( abc.Table, ColumnName, 'FORMSOF( THESAURUS, "wine*" OR "vine*" )')

我需要更改什么才能使其有效?

3 个答案:

答案 0 :(得分:0)

CONTAINSTABLE没有将表名作为参数,它只会搜索列

应该是这样的:

CONTAINSTABLE(ColumnName, 'FORMSOF( THESAURUS, "wine*" OR "vine*" )')

答案 1 :(得分:0)

不可能一蹴而就。来自文档:

<simple_term> ::=   
     { word | "phrase" }  
<prefix term> ::=   
     { "word*" | "phrase*" }   
<generation_term> ::=   
     FORMSOF ( { INFLECTIONAL | THESAURUS } , <simple_term> [ ,...n ] )

https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/containstable-transact-sql?view=sql-server-ver15

如果将其合并为一个术语,可能会非常昂贵,因为您要求 DB 查找带有子字符串的所有单词,然后查找所有与这些单词相似的单词。在你上面的例子中,它必须对 wine* 和 vine* 都这样做。排名也可能很有趣。

一种解决方法是搜索两次,一次使用前缀,一次使用同义词库,然后使用您自己的排名方法组合结果。

答案 2 :(得分:0)

CONTAINSTABLE 可以以表名作为参数

CONTAINSTABLE   
( table , { column_name | ( column_list ) | * } , ' <contains_search_condition> '   
     [ , LANGUAGE language_term]   
  [ , top_n_by_rank ]   
)   

MS Docs