TSQL函数根据关键字解析文本?

时间:2011-06-07 14:53:22

标签: c# asp.net tsql sql-server-2008 sql-function

我需要使用输入SQL Server 2008 sproc的关键字列表构建文本相关性函数,并执行自由文本搜索,返回表行列表。

对于每一行,我想要一个函数,比如“ParseForKeywords(result,listOfKeywords)AS Parsed Result”,根据结果字段构建一个新字符串:

listOfkeywords将是逗号或以空格分隔的单词列表。

如果结果大于100个单词,请执行以下操作: 找到任何关键字的第一个匹配项,减去5或6个单词,然后从那里开始一个新的字符串,作为结果字符串的长度。

如果结果大于200个单词,请执行与上面相同的操作,对于接下来的50个单词,然后查找下一个出现的任何关键字,减去5或6个单词,并附加“...”。< / p>

我正在寻找的是一个起点,以及关于这个逻辑最佳位置的一些建议:在SQL Server上,或者在填充DataTable单元时让.Net代码执行此操作?

如果在TSQL函数中执行此操作:我将首先创建一个游标或CTE来循环逗号分隔的单词列表。每次通过。要查找任何单词的第一个匹配项,我必须遍历关键字的数量以找到最低的CHARINDEX()值。

有没有办法做WHERE IN('word1','word2','word3')??

一旦找到,我将从该charindex值中减去x#个字符,直到我算上4个空格。我还需要看看这些单词中是否有任何单词出现在文本中,此时整个过程将重复。

现在看一下,它至少需要两个功能。

感谢。

3 个答案:

答案 0 :(得分:1)

最适合这样的任务的是写一个CLR StoredProcedure。互联网上有很多例子和指南。

答案 1 :(得分:1)

选项1:在运行查询后,将此逻辑放入要调用的代码中。在包含ParseForKeywords值的结果中添加一个新列。

这是一个更简单的实现,但是如果你正在分页结果会执行错误,因为ParseForKeywords将针对每个结果运行。

选项2:创建CLR函数并在查询中运行ParseForKeywords。

这可能会使您的架构变得更复杂,但在分页结果时这会表现得更好。

答案 2 :(得分:0)

除非您使用全文索引,否则SQL实际上是解析关键字文本的非常糟糕的地方。这是一个很好的概述:

http://www.simple-talk.com/sql/learn-sql-server/understanding-full-text-indexing-in-sql-server/

如果不构建全文索引,您的查询必须解析您线性搜索的每个字符串,这使得这可能非常慢,特别是如果您要搜索大量行。

另一个选择是使用像lucene这样的包,并在数据库之外搜索全文搜索。