我有一个数据库,其中包含可以包含长词的字段.我希望能够在这些列中快速搜索关键字或词组,但在搜索词组时,我希望能够像Google那样搜索词组,返回包含所有指定词的所有行,但不是特别的相互命令或“接近”.此时不需要按相关性对结果进行排名.
在阅读了sql Server的Full-Text Search之后,我认为这正是我所需要的:基于文本列中每个单词的可搜索索引.我的最终目标是安全地接受用户输入并将其转换为利用全文搜索速度的查询,同时保持用户的易用性.
我看到FREETEXT
function可以采用整个短语,将其分解为“有用”的单词(忽略像’和’,’或’,”等单词),然后快速返回匹配行的列表,即使是一个复杂的搜索词.但是当你尝试使用它时,你可能会注意到,而不是AND搜索每个术语,它似乎只进行OR搜索.也许有办法改变它的行为,但我没有找到任何有用的东西.
然后是CONTAINS
,它可以接受布尔查询短语,但有时会产生奇怪的结果.
看看这个表上的以下查询:
数据
PKID Name ----- ----- 1 James Kirk 2 James Cameron 3 Kirk Cameron 4 Kirk For Cameron
Q1: SELECT Name FROM tblName WHERE FREETEXT(Name,'james') Q2: SELECT Name FROM tblName WHERE FREETEXT(Name,'james kirk') Q3: SELECT Name FROM tblName WHERE FREETEXT(Name,'kirk for cameron') Q4: SELECT Name FROM tblName WHERE CONTAINS(Name,'james') Q5: SELECT Name FROM tblName WHERE CONTAINS(Name,'"james kirk"') Q6: SELECT Name FROM tblName WHERE CONTAINS(Name,'"kirk james"') Q7: SELECT Name FROM tblName WHERE CONTAINS(Name,'james AND kirk') Q8: SELECT Name FROM tblName WHERE CONTAINS(Name,'kirk AND for AND cameron')
查询1:
SELECT Name FROM tblName WHERE FREETEXT(Name,'james')
返回“James Kirk”和“James Cameron”.好吧,让我们把它缩小……
查询2:
SELECT Name FROM tblName WHERE FREETEXT(Name,'james kirk')
你猜怎么着.现在你将获得“James Kirk”,“James Cameron”和“Kirk For Cameron”.查询3也发生了同样的事情,所以让我们跳过它.
查询4:
SELECT Name FROM tblName WHERE CONTAINS(Name,'james')
与查询1的结果相同.好的.缩小结果可能……?
查询5:
SELECT Name FROM tblName WHERE CONTAINS(Name,'"james kirk"')
在发现你需要将字符串括在双引号中(如果有空格)之后,我发现这个查询在这个特定的数据集上对我想要的结果很有用!只返回“James Kirk”.精彩!还是……
查询6:
SELECT Name FROM tblName WHERE CONTAINS(Name,'"kirk james"')
废话.不,它匹配那个确切的短语.嗯…在检查syntax for T-SQL’s CONTAINS function之后,我看到你可以在那里抛出布尔关键字,看起来这可能就是答案.让我们来看看…
查询7:
SELECT Name FROM tblName WHERE CONTAINS(Name,'james AND kirk')
整齐.正如所料,我得到了所有三个结果.现在我只写一个函数来填充所有单词之间的单词AND.做完了吧?现在怎么办…
查询8:
SELECT Name FROM tblName WHERE CONTAINS(Name,'kirk AND for AND cameron')
此查询确切地知道它正在寻找什么,除了某些原因,没有结果.为什么?在阅读了大约Stopwords and Stoplists之后,我会做出一个有根据的猜测并说,因为我要求“kirk”,“for”和“cameron”的索引结果的交叉点,并且“for”这个词不会有任何结果(它是一个停用词和所有结果),那么与该结果的任何交集的结果也是空的.它是否实际上是这样的函数对我来说是无关紧要的,因为每次我在那里进行带有停用词的布尔搜索时,这就是CONTAINS函数的可观察行为.
所以我需要一个新的解决方案.
这是NEAR
看起来很有希如果我可以接受用户查询并在它之间添加逗号,这将…等待这与在CONTAINS查询中使用布尔AND相同.但它是否正确地忽略了停用词?
SELECT Name FROM tblName WHERE CONTAINS(Name,'NEAR(kirk,for,cameron)')
不.没有结果.删除“for”一词,然后再次获得所有三个结果. 原文链接:https://www.f2er.com/mssql/76765.html