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() 不会返回所有预期的行
选择带有“is null”子句的查询和子选择/左连接不返回结果