我有一个表,其中包含30个000+记录,名为ProductCodes,其中包含一个列'Value‘。
我已经进行了一个查询,该查询将返回匹配的记录,并使用CONTAINS包含传递的字符串。
Select TOP 5 * from ProductCodes
WHERE CONTAINS(Value,'"pepper*"')它确实返回了包含' Pepper‘的记录,例如Pepper和Bay叶子,Pepper,Dr. .Pepper等。我还有一个准确的记录,它只包含确切的字符串'Pepper’,显示在结果的中间。我只需要选择前5的记录和严格的匹配传递的字符串。
我还尝试使用CONTAINSTABLE
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查询结合起来。
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现在,我可以得到严格匹配和部分匹配,但不知道它将如何使我的查询更慢。
发布于 2020-05-30 13:51:11
最近的查询允许返回同一行两次。另外,“S可以限制比赛结果,考虑比赛的预定权重,以便得到更多相关的输出。”
您应该得到一个更精确的结果:
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;https://dba.stackexchange.com/questions/268182
复制相似问题