我是自由文本搜索的新手,所以请原谅新手问题。假设我有以下全文索引:
Create FullText Index on Contacts(
FirstName,
LastName,
Organization
)
Key Index PK_Contacts_ContactID
Go
我想对连接的所有三列进行自由文本搜索
FirstName + ' ' + LastName + ' ' + Organization
例如
jim smith
会返回名为Jim Smith的所有联系人smith ibm
会返回名为Smith的所有在IBM工作的联系人这似乎是一种相当常见的情况。我原以为这会起作用:
Select c.FirstName, c.LastName, c.Organization, ft.Rank
from FreeTextTable(Contacts, *, 'smith ibm') ft
Left Join Contacts c on ft.[Key]=c.ContactID
Order by ft.Rank Desc
但这显然是smith OR ibm
;它返回了许多不在IBM工作的史密斯,反之亦然。令人惊讶的是,搜索smith AND ibm
会产生相同的结果。
这就是我想要的......
Select c.FirstName, c.LastName, c.Organization
from Contacts c
where Contains(*, 'smith') and Contains(*, 'ibm')
...但是我无法参数化来自用户的查询 - 我必须自己将搜索字符串分解为单词并动态组装SQL,这是丑陋且不安全的。
答案 0 :(得分:2)
我采用的常用方法是创建一个搜索视图或计算列(使用触发器),将所有这些值放入一个字段中。
我做的另一件事是使用全文搜索引擎 - 例如Lucene / Solr。
答案 1 :(得分:0)
布尔运算符仅支持CONTAINS,而不支持FREETEXT。
尝试使用CONTAINSTABLE进行AND查询。