【问题标题】:How can I identify multiple word tags in a text field in SQL如何在 SQL 的文本字段中识别多个单词标签
【发布时间】:2012-03-14 03:26:56
【问题描述】:

我想要一个可以传递文本字符串的 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

如果我的标签表有“绿色”、“红色”和“蓝色”条目,它们会按您的预期返回。

我想知道的是,我如何才能最好地获得类似的结果,但对于包含多个单词的标签...例如,“浅蓝色”

我意识到上面代码的问题是我将源文本拆分为单个单词,因此“浅蓝色”永远不会匹配,但是我可以采取不同的路线而不涉及光标等吗?

感谢您的帮助


刚刚意识到以下将实现我所需要的

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

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

有人对我如何更有效地执行相同的过程有任何想法吗?

【问题讨论】:

  • 最简单的方法是使用逗号分隔的标签。
  • 谢谢马特,不知道这对我有什么帮助。我已经将我的标签作为表格中的单独行,然后我有一个大的 nvarchar(max) 文本块我想比较。我喜欢做一个相交的想法,因为它给出了非常快的结果,但要做到这一点,我必须将我的文本分成单个单词。如何快速将我的文本与我的表格行进行比较以查找包含多个单词的标签?
  • 谢谢康拉德,我同意...我考虑过全文搜索,但您要搜索的文本是否必须在数据库表中才能进行全文搜索或可以你在 SP 中全文搜索变量?
  • @Mojo 你能发布你的问题的解决方案吗??...我有问题

标签: sql sql-server tags intersect


【解决方案1】:

TSQL - A join using full-text CONTAINS查看我的回答

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

【讨论】:

  • Tom,很遗憾,由于我要搜索的 nvarchar(max) 字段是一个变量,而不是数据库表中的全文可搜索字段,因此无法进行全文搜索。跨度>
【解决方案2】:

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

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

因此,我为要搜索文本的短语设置了一个光标,并通过它快速填充一个临时表,其中包含与我匹配的短语 ID。 使用 FAST_FORWARD 和 FORWARD_ONLY 设置来最大化性能的关键。

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

示例代码如下:

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

CREATE TABLE #Matches (PhraseID int)

声明@PhraseID int 声明@PhraseText nvarchar(100)

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

打开 curMatchingPhrases

从 curMatchingPhrases 获取下一个到 @PhraseID、@PhraseText

WHILE @@FETCH_STATUS = 0 开始

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 

结束

关闭 curMatchingPhrases DEALLOCATE curMatchingPhrases

从 #Matches 中选择 *

删除表#Matches

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

魔力

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2019-09-23
    相关资源
    最近更新 更多