我们有一个使用sql Server 2008作为数据库的Web应用程序.我们的用户可以对数据库中的特定列进行全文搜索. sql Server的全文功能似乎不支持点击突出显示.我们是否需要自己构建这个或者是否有一些关于如何做到这一点的图书馆或知识?
BTW应用程序是用C#编写的,因此.Net解决方案是理想的,但不是必需的,因为我们可以翻译.
解决方法
扩展伊斯梅尔的想法,这不是最终的解决方案,但我认为这是一个很好的开始.
首先,我们需要获取使用全文引擎检索的单词列表:
declare @SearchPattern nvarchar(1000) = 'FORMSOF (INFLECTIONAL," ' + @SearchString + ' ")' declare @SearchWords table (Word varchar(100),Expansion_type int) insert into @SearchWords select distinct display_term,expansion_type from sys.dm_fts_parser(@SearchPattern,1033,0) where special_term = 'Exact Match'
人们可以扩展很多,例如搜索模式非常基础;也有可能更好的方法来过滤掉你不需要的单词,但它至少会为你提供一个可以通过全文搜索匹配的词干单词列表等.
在获得所需的结果后,您可以使用RegEx来解析结果集(或者最好只使用一个子集来加速它,尽管我还没有找到一个好方法).为此,我只使用两个while循环和一堆临时表和变量:
declare @FinalResults table while (select COUNT(*) from @PrelimResults) > 0 begin select top 1 @CurrID = [UID],@Text = Text from @PrelimResults declare @TextLength int = LEN(@Text ) declare @IndexOfDot int = CHARINDEX('.',REVERSE(@Text ),@TextLength - dbo.RegExIndexOf(@Text,'\b' + @FirstSearchWord + '\b') + 1) set @Text = SUBSTRING(@Text,case @IndexOfDot when 0 then 0 else @TextLength - @IndexOfDot + 3 end,300) while (select COUNT(*) from @TempSearchWords) > 0 begin select top 1 @CurrWord = Word from @TempSearchWords set @Text = dbo.RegExReplace(@Text,'\b' + @CurrWord + '\b','<b>' + SUBSTRING(@Text,dbo.RegExIndexOf(@Text,'\b' + @CurrWord + '\b'),LEN(@CurrWord) + 1) + '</b>') delete from @TempSearchWords where Word = @CurrWord end insert into @FinalResults select * from @PrelimResults where [UID] = @CurrID delete from @PrelimResults where [UID] = @CurrID end
几点说明:嵌套while循环可能不是最有效的方法,但是没有别的想法.如果我使用游标,那基本上是一回事吗?2. @FirstSearchWord这里指的是原始搜索词之一的文本中的第一个实例,因此基本上你要替换的文本只会在摘要中.同样,这是一个非常基本的方法,某种文本聚类查找算法可能会很方便.3.要首先获得RegEx,您需要CLR用户定义的函数.