SQL 选择带有 FREE TEXT 的结果/返回出现次数较多的行

Posted

技术标签:

【中文标题】SQL 选择带有 FREE TEXT 的结果/返回出现次数较多的行【英文标题】:SQL Select result with FREETEXT / returning row with more occurences 【发布时间】:2021-02-28 19:20:12 【问题描述】:

我对 SQL Server 有以下搜索词:

我想买三星手机,型号应该是 Galaxy S9

表:

ID TEXT
1 samsung s8
2 celular s9
3 samsung galaxy s9
4 galasxy s10

我希望选择返回 ID 3,因为它出现的次数更多。

【问题讨论】:

你可以考虑全文搜索。 我使用了 Freetext,但它返回了所有行,我希望返回的是出现次数更多的行。 ``` select * from Table where FREETEXT(Text,'我要买三星手机,型号应该是galaxy s9') “SQL Select result with mo”是什么意思? CONTAINSTABLE() 最后一个参数1 可能吗? 我要搜索一下 CONTAINSTABLE(),谢谢!还有关于标题,我刚刚更新了一下,才发现写错了 【参考方案1】:

您可以在 单词 级别执行此操作的一种方法是:

select t.*
from t cross apply
     (select count(*) as cnt
      from string_split(t.text, ' ') s1 cross join
           string_split(@sentence, ' ') s2
           on s1.value = s2.value
     ) ss
order by ss.cnt desc;

注意事项:

这只会在两个短语中查找完全匹配的单词。 这要求单词在text 和“句子”中都用空格分隔。 重复的单词可能会通过倒计时。如果需要,可以管理(比如使用count(distinct s1.value) as cnt)。

【讨论】:

【参考方案2】:

有很多方法可以选择两个项目。例如:

SELECT 'I want to buy a ' + A.BrandName + ' cellphone and the model should be ' + A.ModelName 
FROM (
    SELECT SUBSTRING(TEXT, 1, LEN('sumsung')) AS BrandName
        , SUBSTRING(TEXT, LEN(SUBSTRING(TEXT, 1, LEN('sumsung')))+1, LEN(TEXT)) AS ModelName
    FROM TABLE_NAME
    WHERE TEXT LIKE N'%samsung%' AND TEXT LIKE N' %galaxy s9%'
) AS A

【讨论】:

我希望选择查询像一个句子,返回应该是出现次数较多的行。那句话“我想买个三星手机,型号应该是galaxy s9”。只是一个例子。 我更新了我的答案。检查并给我回复。 非常感谢您的回答,但我想要更通用的东西,那句话只是一个例子。我的情况是我想构建一个聊天机器人,并且我希望此选择返回最佳答案,其中包含更多用户提出的问题。 谢谢,我刚刚回复了!非常感谢您的帮助,干杯!

以上是关于SQL 选择带有 FREE TEXT 的结果/返回出现次数较多的行的主要内容,如果未能解决你的问题,请参考以下文章

带有单个单词的 SQL Contains() 不会返回所有预期的行

带有 COUNT() 函数的 SQL 联合未返回预期结果

带有参数的 PL/SQL 过程/函数从选择查询返回表

选择带有“is null”子句的查询和子选择/左连接不返回结果

从带有 HAVING 子句的 MySQL 视图中选择返回空结果集

如何从 SQL 返回的结果中选择结果