1

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

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

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

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

如果结果大于 200 个单词,则与上述相同,对于接下来的 50 个单词,然后找到任何关键字的下一次出现,减去 5 或 6 个单词并附加“...”。

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

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

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

一旦找到它,我将从该 charindex 值中减去 x # 个字符,直到我数到 4 个空格。我还需要看看这些词中的任何一个是否出现在文本的后面,然后整个过程会重复。

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

谢谢。

4

3 回答 3

1

最适合此类任务的是编写 CLR StoredProcedure。互联网上有很多示例和指南。

于 2011-06-08T16:07:09.240 回答
1

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

这是一个更简单的实现,但如果您对结果进行分页,则性能会很差,因为 ParseForKeywords 将为每个结果运行。

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

这可能会使您的体系结构更复杂一些,但在分页结果时会执行得更好。

于 2011-06-08T16:18:52.053 回答
0

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

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

在不构建全文索引的情况下,您的查询必须线性解析您搜索的每个字符串,这使得这可能是一个非常慢的操作,尤其是当您有很多行要搜索时。

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

于 2011-06-08T16:29:48.477 回答