首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中使用CONTAINSTABLE/CONTAINSTABLE获得精确和最近的搜索

在SQL中使用CONTAINSTABLE/CONTAINSTABLE获得精确和最近的搜索
EN

Database Administration用户
提问于 2020-05-30 04:33:06
回答 1查看 1.2K关注 0票数 0

我有一个表,其中包含30个000+记录,名为ProductCodes,其中包含一个列'Value‘。

我已经进行了一个查询,该查询将返回匹配的记录,并使用CONTAINS包含传递的字符串。

代码语言:javascript
复制
Select TOP 5 * from ProductCodes
WHERE CONTAINS(Value,'"pepper*"')

它确实返回了包含' Pepper‘的记录,例如Pepper和Bay叶子,Pepper,Dr. .Pepper等。我还有一个准确的记录,它只包含确切的字符串'Pepper’,显示在结果的中间。我只需要选择前5的记录和严格的匹配传递的字符串。

我还尝试使用CONTAINSTABLE

代码语言:javascript
复制
SELECT Value, RANK FROM
ProductCodes PC
INNER JOIN
CONTAINSTABLE(ProductCodes,Value,N'pepper') AS KEY_TBL
ON PC.Value = KEY_TBL.[KEY]
ORDER BY RANK DESC

我试着使用一个WHERE rank = 1000,它是我在某个地方读到的最接近匹配的排名,但是当我发现唱片的排名'Pepper‘是128个,超过一个单词匹配的词组的排名更高。

我对使用FREETEXT and Semantics相当陌生,所以我仍然在学习它。我怎样才能在我的前5名中得到准确的匹配和“部分”的匹配?提亚

编辑:

我添加了一个UNION ALL查询,其中它首先选择相等的记录,并将它与我的CONTAINS查询结合起来。

代码语言:javascript
复制
SELECT TOP 5 * FROM (
 SELECT TOP 5 * From ProductCodes 
 WHERE Value = 'pepper'
 UNION ALL 
 Select TOP 5 * from ProductCodes
 WHERE CONTAINS(Value,'"pepper*"')
) as Value

现在,我可以得到严格匹配和部分匹配,但不知道它将如何使我的查询更慢。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2020-05-30 13:51:11

最近的查询允许返回同一行两次。另外,“S可以限制比赛结果,考虑比赛的预定权重,以便得到更多相关的输出。”

您应该得到一个更精确的结果:

代码语言:javascript
复制
WITH CTE
AS
(
    SELECT 10000 AS RANK,
        P.id, 
        P.value 
    FROM ProductCodes P
    WHERE P.value = 'pepper'

    UNION

    SELECT k.RANK,
        P.id, 
        P.value 
    FROM ProductCodes P
        INNER JOIN  
          CONTAINSTABLE(ProductCodes, value, 'ISABOUT (pepper WEIGHT(0.2), 
            "pepper*" WEIGHT(0.1))',  
            5) AS K  
          ON P.id = K.[KEY]
    WHERE value <> 'pepper'
) 
SELECT TOP (5) RANK, id, value
FROM CTE
ORDER BY RANK DESC;

参考资料:

使用加权值(加权项)搜索单词或短语

使用秩限制搜索结果的示例

共通_表格_表达式(Transact-SQL)

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/268182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档