如何在SQL中的文本字段中标识多个单词标记

时间:2012-02-23 17:19:59

标签: sql sql-server tags intersect

我希望有一个可以传递文本字符串的SQL过程,它会从关键字表中识别文本中的特定关键字(标签)。

到目前为止,我有以下内容可以很好地用于单个单词;

INSERT INTO #tags SELECT Word 
FROM dbo.SplitWords('some colours are blue, green, red and light blue')

SELECT Word
FROM    #tags
INTERSECT
SELECT  Tag
FROM    dbo.Tags

DROP TABLE #tags

如果我的代码表中包含“绿色”,“红色”和“蓝色”条目,则会按照您的预期返回它们。

我想知道的是我如何才能获得类似的结果,但对于多个单词的标签...例如,'浅蓝色'

我意识到我对上面代码的问题是我将源文本分成单个单词,所以'浅蓝'永远不会匹配,但是我可以采用不同的路径,不会调用游标等吗? / p>

感谢您的帮助


刚刚意识到以下内容将实现我的需求

DECLARE @Text as nvarchar(max)

SELECT @Text = 'some colours are blue, green, red and light blue'

SELECT  TagID, 
    Tag 
FROM    Tags 
WHERE   @Text LIKE '% ' + Tag + ' %' 
ORDER BY Tag

但是我担心如果我的表有几千行并且我正在搜索的文本字符串很长,那么效率可能会很低。

任何人都对如何更有效地完成同样的过程有任何想法?

2 个答案:

答案 0 :(得分:0)

TSQL - A join using full-text CONTAINS

上查看我的答案

它利用了@Conrad的想法,但让你超越了CONTAINS的变量限制

答案 1 :(得分:0)

好的,我已经解决了以前的解决方案,直到我有时间重新思考/等待它成为一个问题。 旧方法现在花费太长时间来执行,迫使我找到替代解决方案。

在玩了一些我发现的最佳解决方案后(就执行时间而言)是光标....

因此,我设置了一个光标,用于搜索文本的短语和闪电通过它填充临时表,其中包含与我一致的短语ID。 使用FAST_FORWARD和FORWARD_ONLY设置来最大化性能的关键是。

完成后,我只需将临时表连接回我的数据库表,即可返回我需要的短语的详细信息。

以下示例代码:

DECLARE @PageText nvarchar(max) - 页面文本的参数

CREATE TABLE #Matches(PhraseID int)

DECLARE @PhraseID int DECLARE @PhraseText nvarchar(100)

DECLARE curMatchingPhrases CURSOR FAST_FORWARD FORWARD_ONLY FOR SELECT p.PhraseID,         p.PhraseText 来自短语p

OPEN curMatchingPhrases

FETCH NEXT FROM curMatchingPhrases INTO @PhraseID,@ PhraseText

WHILE @@ FETCH_STATUS = 0 BEGIN

IF EXISTS (SELECT 'match' WHERE @PageText LIKE '% ' + @PhraseText + ' %')
BEGIN
    INSERT #Matches SELECT  @PhraseID
    WHERE   @PhraseID NOT IN (SELECT PhraseID FROM #Matches)
END

FETCH NEXT FROM curMatchingPhrases INTO @PhraseID, @PhraseText 

END

关闭curMatchingPhrases DEALLOCATE curMatchingPhrases

SELECT * FROM #Matches

DROP TABLE #Matches

我相信这里的其他人将能够找到更优雅的解决方案,但光标已经为我减少了6 +秒SP降至0 - 1秒,所以我现在很高兴。