gpt4 book ai didi

sql - 如何使用 T-SQL 全文搜索来获得像 Google 一样的结果?

转载 作者:行者123 更新时间:2023-12-02 10:23:43 24 4
gpt4 key购买 nike

我需要什么

我有一个数据库,其中的字段可以包含长短语。我希望能够在这些列中快速搜索关键字或短语,但是在搜索短语时,我希望能够像 Google 一样搜索该短语,返回包含所有指定单词的所有行,但不特定彼此之间的秩序或“接近”。此时无需按相关性对结果进行排名。

阅读有关 SQL Server 的 Full-Text Search 后,我认为这正是我所需要的:基于文本列中每个单词的可搜索索引。我的最终目标是安全地接受用户输入并将其转换为利用全文搜索速度的查询,同时保持用户的易用性。

问题:全文搜索功能不像 Google 那样进行搜索

我看到 FREETEXT function可以获取整个短语,将其分解为“有用”的单词(忽略“and”、“or”、“the”等单词),然后非常快速地返回匹配行的列表,即使使用复杂的搜索词。但当您尝试使用它时,您可能会注意到,它似乎只执行 OR 搜索,而不是对每个术语进行 AND 搜索。也许有一种方法可以改变它的行为,但我还没有发现任何有用的东西。

然后是CONTAINS ,它可以接受 bool 查询短语,但有时会产生奇怪的结果。

查看此表中的以下查询:

数据

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')

返回“詹姆斯·柯克”和“詹姆斯·卡梅隆”。好吧,让我们缩小范围......

查询 2:

SELECT Name FROM tblName WHERE FREETEXT(Name, 'james kirk')

你猜怎么着。现在您将获得“詹姆斯·柯克”、“詹姆斯·卡梅隆”和“卡梅隆的柯克”。 查询 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 ,我发现您可以在其中添加 bool 关键字,看起来这可能就是答案。让我们看看...

查询 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”不会有任何结果(什么与它是一个停用词等),那么与该结果的任何交集的结果也是空的。它是否真的起到这样的作用与我无关,因为这是每次我使用其中的停用词进行 bool 搜索时 CONTAINS 函数的可观察行为。

所以我需要一个新的解决方案。

来了NEAR

看起来很有希望。如果我可以接受用户查询并在其之间放置逗号,这将...等等,这与在 CONTAINS 查询中使用 bool AND 是一样的。但它是否正确忽略停用词?

SELECT Name FROM tblName WHERE CONTAINS(Name, 'NEAR(kirk, for, cameron)')

不。没有结果。删除“for”一词,您将再次获得所有三个结果。 :(

现在怎么办?

最佳答案

我找到了another question on here涉及同一主题。事实上,详细介绍该方法的帖子甚至标题为“A Google-like Full Text Search”。它使用名为 Irony 的开源库解析用户输入的搜索字符串并将其转换为与 FTS 兼容的查询。

这是source code for the latest version类似 Google 的全文搜索。

关于sql - 如何使用 T-SQL 全文搜索来获得像 Google 一样的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23816039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com