Phi*_*den 8 sql-server full-text-search highlighting hit-highlighting
我们有一个使用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, 0)
where special_term = 'Exact Match'
Run Code Online (Sandbox Code Playgroud)
已经有很多东西可以扩展,例如搜索模式是非常基本的;也可能有更好的方法来过滤掉您不需要的单词,但至少它为您提供了一个可以通过全文搜索匹配的词干词等列表。
获得所需的结果后,您可以使用 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
Run Code Online (Sandbox Code Playgroud)
几点注意事项:
1. 嵌套 while 循环可能不是最有效的方法,但我没有想到其他方法。如果我使用游标,它本质上是一样的吗?
2.@FirstSearchWord这里的 to 指的是原始搜索词文本中的第一个实例,因此本质上您要替换的文本只会出现在摘要中。同样,这是一个非常基本的方法,某种文本聚类查找算法可能会很方便。
3. 要首先获得 RegEx,您需要 CLR 用户定义函数。
| 归档时间: |
|
| 查看次数: |
7986 次 |
| 最近记录: |